共享库与接口中的 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之前的编译和链接感兴趣。我也只对 Linux 和 Mac OS X 感兴趣,使用 GCC。
我已经在 mailing list 上回答了这个问题,但正如 Marc 所说,它会起作用。
无论您是在 DSO 内部还是在界面中使用该库都没有任何区别,该库不在乎,并且可以向后兼容 GCC 3.4。
我有一个包含 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之前的编译和链接感兴趣。我也只对 Linux 和 Mac OS X 感兴趣,使用 GCC。
我已经在 mailing list 上回答了这个问题,但正如 Marc 所说,它会起作用。
无论您是在 DSO 内部还是在界面中使用该库都没有任何区别,该库不在乎,并且可以向后兼容 GCC 3.4。