从 python ctypes 调用 CPP 函数

Posted

技术标签:

【中文标题】从 python ctypes 调用 CPP 函数【英文标题】:Calling CPP function from python ctypes 【发布时间】:2018-01-07 02:46:53 【问题描述】:

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

我需要从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 - 没有帮助。 是否有任何通用方法可以指定我的库需要加载所有依赖项? (如在 windows dll 中?)

谢谢,打扰了。

【问题讨论】:

试试g++ 而不是gcc @RustyX 它有效...但是为什么呢?问题 - 本机库是另一个使用 gcc 构建的大项目的一部分,没有办法改变它...... 【参考方案1】:

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

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

注意:g++ 大致相当于gcc -xc++ -lstdc++ -shared-libgcc。因此,如果您真的想使用 gcc 命令,这可能是您的解决方案。有关 compile 和 link 选项的更多详细信息,请参阅 GCC 文档。

【讨论】:

以上是关于从 python ctypes 调用 CPP 函数的主要内容,如果未能解决你的问题,请参考以下文章

Python调用DLL动态链接库——ctypes使用

通过 ctypes 从 Python 调用的 C 函数返回不正确的值

使用 Python 的 ctypes 调用涉及自定义类型的函数

Python ctypes:如何调用应该返回字符串数组的函数?

使用 ctypes 时 Dll 函数的名称错误 [重复]

Python 外部函数调用库ctypes简介