C++代码可以与其他C++代码可靠地交互吗?

Ale*_*ing 5 c++ shared-libraries abi

在C中,我习惯于编写一个可以从任何客户端代码调用的共享库,只需链接库并包含相关的头文件即可使用它.但是,我已经读过C++的ABI过于易变,非标准,无法从其他来源可靠地调用函数.

这将使我相信在C++中创建像C一样通用的真正共享库是不可能的,但现实世界的实现似乎表明不是这样.例如,Node.js公开了一个非常简单的模块系统,它允许使用该函数动态导出普通的C++函数(不extern "C").NODE_SET_METHOD

C++ API的哪些元素可以安全公开(如果有的话),以及允许C++代码与其他C++代码交互的常用方法是什么?是否可以创建可以公开C++类的共享库?或者由于ABI不一致,是否必须为每个程序单独重新编译这些类?

Han*_*ant 4

是的,C++ 互操作很困难并且充满陷阱。冷硬规则是,您必须使用完全相同的编译器版本和完全相同的编译器设置来构建模块,并确保它们共享完全相同的 CRT 和标准 C++ 库。违反这些规则往往会导致 C++ 类在划分的两端没有相同的布局,并且当一个模块使用与删除对象的模块不同的分配器来分配对象时,内存管理会出现问题。当代码使用错误的偏移量访问类成员并泄漏内存或损坏堆时,导致很难诊断运行时故障的问题。

Node.js 首先导出任何内容,从而避免了这些问题。NODE_SET_METHOD() 不会做你想象的那样,它只是将一个符号添加到 Javascript 引擎的符号表中,以及在脚本中调用该函数时调用的函数指针。此外,它是一个开源项目,因此使用相同的编译器和运行时库构建所有内容都不是问题。