gpt4 book ai didi

c++ - C++ 代码能否与其他 C++ 代码可靠地交互?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:08 24 4
gpt4 key购买 nike

在 C 中,我习惯于能够编写一个共享库,可以从任何希望使用它的客户端代码调用,只需链接库并包含相关的头文件即可。但是,我有 read that C++'s ABI太易变且不标准,无法从其他来源可靠地调用函数。

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

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

最佳答案

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

Node.js 通过首先 导出任何东西来避免这些问题。 NODE_SET_METHOD() 并没有像您想象的那样做,它只是在 Javascript 引擎的符号表中添加了一个符号,以及一个在脚本中调用函数时调用的函数指针。此外,它是一个开源项目,因此使用相同的编译器和运行时库构建一切不是问题。

关于c++ - C++ 代码能否与其他 C++ 代码可靠地交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17186980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com