歡迎轉載,轉載請註明原文地址:http://blog.csdn.net/majianfei1023/article/details/46781581
linux編譯boost的鏈接:http://blog.csdn.net/majianfei1023/article/details/46761029
昨天編譯安裝好boost,今天準備使用boost.python寫個python調用c++代碼的例子,結果踩了很多坑。
首先貼上代碼:
1.student.cpp,一個普通的c++類
#include <iostream>
#include <string>
using namespace std;
class student
{
public:
void setname(string str)
{
name_ = str;
}
string getname()
{
return name_;
}
void setage(int age)
{
age_ = age;
}
int getage()
{
return age_;
}
private:
string name_;
int age_;
};
2.student2py.cpp,把c++封裝成python模塊的代碼,使用了boost.python
#include <boost/python.hpp>
#include "student.cpp"
using namespace boost::python;
BOOST_PYTHON_MODULE(example) //python模塊
{
class_<student>("student")
.def("setname",&student::setname)
.def("getname",&student::getname)
.def("setage",&student::setage)
.def("getage",&student::getage)
.add_property("name",&student::getname,&student::setname)
.add_property("age",&student::getage,&student::setage)
;
}
example.so:student.o student2py.o
g++ student2py.o -o example.so -shared -fPIC -I/usr/include/python2.6 -I/home/mjf/lib/include -L/usr/lib/python2.6 -L/home/mjf/lib/lib -lboost_python
student.o:
g++ -c student.cpp -o student.o
student2py.o:student.o
g++ -c student2py.cpp -o student2py.o -fPIC -I/usr/include/python2.6 -I/home/mjf/lib/include
clean:
rm -rf student.o student2py.o
rm -rf example.so
import example
stu = example.student()
stu.setname("mjf")
stu.setage(25)
print stu.name
print stu.age
1.
../boost/python/detail/wrap_python.hpp:50:23: error: pyconfig.h: No such file or directory
./boost/python/detail/wrap_python.hpp:75:24: error: patchlevel.h: No such file or directory
./boost/python/detail/wrap_python.hpp:78:2: error: #error Python 2.2 or higher is required for
./boost/python/detail/wrap_python.hpp:142:21: error: Python.h: No such file or directory
./boost/python/instance_holder.hpp:34: error: ‘PyObject’ has not been declared
./boost/python/instance_holder.hpp:41: error: expected ‘;’ before ‘(’ token
./boost/python/instance_holder.hpp:45: error: ‘PyObject’ has not been declared
./boost/python/detail/wrapper_base.hpp:21: error: expected initializer before ‘*’ token
./boost/python/detail/wrapper_base.hpp:23: error: expected initializer before ‘*’ token
各種查資料發現是python的問題。
缺少依賴庫 python-devel,要安裝一下:
sudo yum install python-devel
2.解決了上面的問題,又發現了新的問題,
/usr/bin/ld: cannot find -lboost_python
一查,果然發現沒有libboost_python.so,安裝boost的時候我的確是完全安裝的,不知道怎麼搞的,沒裝好估計。重新裝了一下boost.python
./bootstrap.sh --prefix=/home/mjf/lib
sudo ./b2 --with-python install
大功告成,花了接近兩個小時解決一些問題。可以成功用python調用example.so
最後:感謝stackoverflow,很多問題的答案都能在上面找得到。