我希望能够使用 ctypes python 模块从 python 中使用 C/C++ 函数。
我有一个函数int doit()
在 .c
/.cpp
文件。当我尝试加载共享库时:
Frr=CDLL("/path/FoCpy2/libFrr.so")
Frr.doit(c_int(5))
我发现当.c
时它工作得非常好。使用变体。当调用 C++ 时,调用此函数的好方法是(使用 nm libFrr.so
发现使用 nm -gC libFrr.so
生成简单的 doit()
):
Frr._Z4doitv(c_int(5))
我在 Stackexchange 上读到,没有从 python 调用 C++ 的标准方法,并且存在“非标准名称修改”问题。 “Z4”是这个问题的一部分吗?我想非标准名称重整会出现在更高级的语言功能中,例如类方法、模板,但也会出现在此类基本功能中?是否可以在 C++ 代码的简单情况下强制使用简单的 C 函数名称?
最佳答案
您可以使用 extern "C"
使函数对于外界来说“看起来像”C 函数(即禁用名称修改)。是的,你是对的,名称重整主要用于 C++ 具有的更复杂的功能和函数类型,并且名称重整方案从未标准化(也没有二进制兼容性),因此它因编译器而异以及版本之间的差异(但大多数主流编译器现在已经解决了一些永久性问题,但编译器供应商之间仍然存在差异)。普通的旧自由函数也需要重整的原因是因为 C++ 支持重载(相同的函数名称但具有不同的参数),因此编译器会将参数规范(例如类型)编码到重整名称中。当然,如果您使用extern "C"
,您将丢失所有需要名称修改的功能,因此,它或多或少只能归结为 C 函数。
您可以在每个函数的基础上使用extern "C"
,如下所示:
extern "C" int doit();
或者对于整个标题:
extern "C" {
// all the function declarations here ...
};
但是,特别是对于 Python,我强烈建议您使用一个库,该库允许您构建反射(reflect) C++ 类和函数的 Python 类和函数,这使生活变得更加轻松,并隐藏了所有这些外部“C”业务。我建议使用Boost.Python ,请参阅此 getting started page ,它使得将函数和类导出到 Python 变得轻而易举。我想其他人也会推荐SWIG ,但我从来没有用过。
关于c++ - 共享库符号名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13886887/