在我关于python& c ++集成的最后一个问题之后,我被告知要在windows上使用dll。 (Previous question)
这工作正常:
cl /LD A.cpp B.cpp C.pp
在windows环境中,设置了boost,cryptopp源和cryptopp库的包含路径。
现在我正在尝试在linux中做同样的事情,创建一个.so文件,通过python2.5上的ctypes导入。 我做了:
gcc -Wall -Wextra -pedantic A.cpp B.cpp C.cpp /usr/lib/libcryptopp.so -shared -o /test/decoding.so
并创建了so对象。如果删除“-shared”编译是可以的,但在那里停止没有主要(显然;))。当然libcryptopp.so也存在。
但是当我去python并导入“so”文件时,它说该属性没有对象“解密”,“加密”或者我放在那里的任何东西。在dll对象上使用“dir”确认它们不存在。
外部函数在A.cpp中定义为:
int encrypt (params...)
//..
return num;
int decrypt (params...)
//..
return num;
也尝试使用:
extern "C" encrypt (params...)
.....
有谁能告诉我我做错了什么?
提前致谢!
拉格
答案 0 :(得分:3)
C ++编译器破坏了函数的名称。要做你想做的事,你必须在
中有声明原型extern "C" {...}
很难从您的示例中了解您在源文件中到底有什么。 正如已经提到的那样,使用nm实用程序来查看共享对象中的对象。
不使用-shared编译对象。据我所知,Python加载库不支持静态链接对象。
使用g ++编译器编译对象,它将链接到标准C ++库,gcc不会。
答案 1 :(得分:1)
自从使用boost以来,只需要重复检查。
#include <string>
#include <boost/python.hpp>
using namespace std;
string hello(string s){
return "Hello World!";
}
BOOST_PYTHON_MODULE(pyhello){
using namespace boost::python;
def("hello", hello);
}
在python中
>>> import pyhello
>>> print pyhello.hello()
Hello World!
只是我的2美分,对不起,如果这对你没有帮助。