c++ - 共享库符号名称

标签 c++ python c interop ctypes

我希望能够使用 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/

相关文章:

c++ - 反转或反向迭代 unordered_map

c - 什么是线程池?

c - select() 在 SIGALRM 时返回套接字准备就绪

c++ - Atom Editor 中是否支持 C/C++ 语言的多行注释?

c++ - 为什么这个语句 `priority_queue <pair<int,int>, vector<pair<int,int>>,compare>pq;` 在 C++03 中是错误的,但在 C++11 中是正确的?

C++ WinHttp 请求作为 TCP 发送?

python - 在 Python 中的 Web 浏览器中打开和处理 URL 的最快方法

python - 在 C 中嵌入 python - 分发

python - Scrapy 只抓取和爬取 HTML 和 TXT

C - 枚举 - 定义