【发布时间】:2015-11-27 13:46:14
【问题描述】:
我有一个带有 STL 对象的应用程序,用作插件编写器的 C++ 接口的一部分。
我知道最好的兼容性选择是使用 C 接口,但目前不可行。
我知道 libstdc++ 中从 GCC 3.4 到 4.8 的所有内容在 ABI 方面都高度兼容。
因此,例如,如果我使用 GCC 4.1 编译,而插件供应商编写使用 GCC 4.7 编译的代码,那么在具有对应于 GCC 4.7 或更高版本的 libstdc++ 版本的平台上,除了极端情况外,所有情况都很好,提供的 STL 使用仅限于 .so 内部,并且外部 .so 接口使用纯 C,遗憾的是我不是这种情况。
所以,我很好奇关于用作插件接口一部分的 STL 类的情况。我可以在未使用相同编译器版本(例如 4.1 和 4.8)编译的共享对象之间安全地传递 STL 对象吗?如果人们使用不同的编译器选项,我需要注意如何编译和解析模板吗?
我怀疑这会有问题。但是,GCC 人员所做的符号版本控制魔法有可能以某种方式使这项工作发挥作用。
对于这个问题,我只对 C++11 之前的编译和链接感兴趣。我也只对使用 GCC 的 Linux 和 Mac OS X 感兴趣。
【问题讨论】:
-
除非人们竭尽全力让它失败,否则它应该可以正常工作。
-
@marc 感谢您的反馈。您是否有机会提供更详细的参考或链接(或者可能依赖于此的项目)?
-
不过,对于 gcc >= 5.0,它不一定有效,因为它们 changed their ABI
-
谢谢@Walter - 乔纳森在邮件列表中指出了同样的事情,所以我知道库二进制接口在 5.0 中更改为 std::string 之类的东西。