从python ctypes调用CPP函数

时间:2018-01-07 02:46:53

标签: python c++ interop ctypes

我知道 - 有十亿个类似的问题。我尝试了大多数(甚至全部),但没有一个帮助过。

我需要从python中调用 c ++ 11 函数。

// test.cpp
#define DLL_PUBLIC extern "C" __attribute__ ((visibility ("default")))
DLL_PUBLIC int init_module(void** module, void** error);

我正在构建如下:

# Make
gcc -std=c++11 -c -Wall -Werror -fPIC test.cpp
gcc -shared -o libtest.so test.o

Python代码:

# test.py
test_lib = CDLL('./libtest.so')

例外:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    test_lib = CDLL('./libtest.so', mode=1 )
  File "/usr/lib/python3.5/ctypes/__init__.py", line 347, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./libtest.so: undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE

我已经尝试在加载我之前加载clib和stdlib - 没有帮助。 有没有通用的方法来指定我的lib需要在加载时加载所有依赖项? (如在windows dlls中?)

谢谢,抱歉打扰。

1 个答案:

答案 0 :(得分:2)

您似乎正在使用gcc命令进行编译和链接,该命令默认为C模式。对于C ++模式,您应该使用g++命令。

为了编译它不是问题,因为GCC检测到.cpp扩展并切换到C ++模式,但是对于链接,你真的需要告诉GCC以C ++模式链接,否则它赢了“ t链接C ++运行时库。

注意:g++大致相当于gcc -xc++ -lstdc++ -shared-libgcc。如果您真的想使用gcc命令,那么这可能是您的解决方案。有关compilelink选项的GCC文档,可以找到更多详细信息。