Python导入&使用cdll(带有linux .so文件)

时间:2009-11-22 03:50:29

标签: c++ python linux file shared-libraries

在我关于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...)
.....

有谁能告诉我我做错了什么?

提前致谢!

拉​​格

2 个答案:

答案 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美分,对不起,如果这对你没有帮助。