共享库与接口中STL对象的GCC兼容性
GCC compatibility of shared libraries with STL objects in their interface
我有一个带有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。
相关文章:
- 自定义对象的dlib序列化在gcc中失败
- 为什么库API+编译器ABI足以确保具有不同版本gcc的对象之间的兼容性
- GCC __attribute__((constructor)) 在对象构造函数之前调用
- l值引用对象上的Constexpr成员函数:Clang和gcc不同意
- 初始化不可移动对象数组:为什么这样的代码无法在 GCC 上编译?
- 告诉 GCC 假设对象已初始化
- 链接 gcc 6、gcc 7 和 gcc 8 对象是否安全?
- GCC 需要大量内存来编译堆栈上具有非常大对象的 C++ 文件
- GCC 对象按值或地址传递
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- GNU GCC会跟踪以前使用箭头操作员对的对象
- GCC链接器 - 将存档中的所有对象文件映射到特定部分
- 如何动态链接 GCC 对象
- gcc编译错误,对象初始化被解释为函数指针
- 为什么gcc和msvc允许const对象没有用户提供的构造函数?这是个bug吗
- 带有本地创建对象的gcc未定义引用
- C++ "错误:"引用中缺少对象..."取决于 GCC 版本
- GCC 一起构建对象和依赖项文件
- GCC 在被杀时创建带有随机后缀的对象文件
- 如何将一个 ostringstream 对象复制到另一个对象中(使用 gcc-4.7.0)