【问题标题】:Python importing & using cdll (with a linux .so file)Python 导入和使用单元格(带有 linux .so 文件)
【发布时间】:2010-12-19 03:55:43
【问题描述】:

在我最后一个关于 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”编译是可以的,但因为没有 main 在那里停止(显然;))。当然 libcryptopp.so 也存在。

但是当我去 python 并导入“so”文件时,它说该属性没有对象“解密”、“加密”或我放在那里的任何东西。在 dll 对象上使用“dir”确认它们不存在。

外部函数在 A.cpp 中定义为:

int encrypt (params...)
//..
return num;

int decrypt (params...)
//..
return num;

也尝试使用:

extern "C" encrypt (params...)
.....

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

提前致谢!

抹布

【问题讨论】:

  • 您是如何尝试“导入” .so 库的?使用 ctypes?
  • 您可以在 .so 库中使用 nm 实用程序来显示它公开的名称。
  • from ctypes import cdll mydll = cdll.LoadLibrary('/test/decoding.so') mydll nm 也不显示它们

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


【解决方案1】:

C++ 编译器会破坏函数的名称。要做你想做的事,你必须在里面有声明原型

extern "C" {...}

很难从您的示例中看出源文件中究竟有什么。 正如有人已经提到的,使用 nm 实用程序查看共享对象中有哪些对象。

不要编译没有 -shared 的对象。据我所知,Python 加载库不支持静态链接的对象。

使用 g++ 编译器编译您的对象,它将链接到标准 C++ 库,而 gcc 不会。

【讨论】:

  • 谢谢,似乎真正的问题是使用 gcc 而不是 g++,因为它做了一些糟糕的事情。将原型与 extern "C" 放在一起并更改编译器就可以了;)
【解决方案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!

只是我的 2 美分,如果这对您没有帮助,请见谅。

【讨论】:

  • 不直接使用boost,但我喜欢这个例子,等我有时间再测试。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-11-19
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多