我应该如何使用python ctypes.CDLL从.so调用函数?



我试图在我的python项目中运行c++代码。这是recompile.sh,它很好地构建了共享对象。

g++ -fPIC -shared -I /home/pathto python/python3.8/ src/example.hpp 
/usr/lib/x86_64-linux-gnu/libboost_python38.so -o src/example.so

example.hpp:

#include <boost/python.hpp>
int get_answer_c(){
return 42;
}
BOOST_PYTHON_MODULE(example){
boost::python::def("get_answer", get_answer_c);
}

当我尝试导入模块示例时,我得到这个错误:

AttributeError: ./src/example.so: undefined symbol: get_answer

EDIT:

只有当我使用.cpp而不是.hpp时才能正确编译
(libboost_python38.sosrc/example.cpp之后)


我使用这个makefile正确编译了它。

首先编译example.o,然后是example.so

项目-lboost_python38必须在src/example.o之后


我保持代码在.cpp,因为.hpp似乎头。


makefile

src/example.so: src/example.o
g++ 
-shared 
-L/usr/lib/x86_64-linux-gnu/ 
-o src/example.so 
src/example.o 
-lboost_python38
src/example.o:
g++ 
-c 
-fPIC 
-I/usr/include/python3.8 
-o src/example.o 
src/example.cpp
clean:
rm src/example.o src/example.so


编辑:

我得到正确的模块,即使是

g++ -fPIC -shared -I/usr/include/python3.8 -o src/example.so src/example.cpp /usr/lib/x86_64-linux-gnu/libboost_python38.so

或不同顺序

g++ -fPIC -shared -I/usr/include/python3.8 src/example.cpp /usr/lib/x86_64-linux-gnu/libboost_python38.so -o src/example.so

我总是去文件夹src,运行python3.8和运行行

import example
example.get_answer()

相关内容

最新更新