共享库与接口中STL对象的GCC兼容性

GCC compatibility of shared libraries with STL objects in their interface

本文关键字:对象 GCC 兼容性 STL 接口 共享      更新时间:2023-10-16

我有一个带有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和MacOSX感兴趣。

我已经在邮件列表上回答了这个问题,但正如Marc所说,它会起作用的。

无论您是在DSO内部还是在接口中使用该库,都没有任何区别,该库都不在乎,并且可以向后兼容到GCC 3.4。