Python导入并使用cdll(带有Linux .so文件)
在我之前关于Python和C++整合的问题中,有人建议我在Windows上使用dll文件。
我按照这个建议做了,执行了:
cl /LD A.cpp B.cpp C.pp
在Windows环境下,这个方法效果不错,前提是我已经设置好了boost、cryptopp源文件和库的包含路径。
现在我想在Linux上做同样的事情,创建一个.so文件,然后通过ctypes在Python 2.5中导入。我执行了:
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”文件时,它提示没有“decrypt”、“encrypt”或者我放进去的其他属性。用“dir”命令查看这个dll对象,确认这些属性确实不存在。
外部函数在A.cpp中定义如下:
int encrypt (params...)
//..
return num;
int decrypt (params...)
//..
return num;
我还尝试过使用:
extern "C" encrypt (params...)
.....
有人能告诉我我哪里做错了吗?
提前谢谢大家!
Rag
2 个回答
只是想再确认一下,因为你在使用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!
这只是我个人的看法,如果这对你没有帮助,抱歉。
C++ 编译器会对函数的名字进行处理,这个过程叫做“名称修饰”。如果你想实现你所尝试的功能,你必须在
extern "C" {...}
你的示例代码中很难看出你在源文件里到底写了什么。正如有人提到的,可以使用 nm 工具来查看你的共享对象里包含了哪些对象。
在编译你的对象时,记得加上 -shared 这个选项。根据我所知道的,Python 加载库不支持静态链接的对象。
建议你使用 g++ 编译器来编译你的对象,这样它会链接到标准的 C++ 库,而 gcc 则不会。