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

13

我有一个应用程序,其中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感兴趣。


1
除非有人刻意让它失败,否则它应该能够正常工作。 - Marc Glisse
@marc 感谢您的反馈。您能否提供一个更详细一点的参考或链接(或者依赖于此的项目)? - Rob
1
然而,对于gcc >= 5.0,这并不一定适用,因为它们更改了其ABI - Walter
感谢 @Walter - Jonathan 在邮件列表上指出了同样的问题,所以我知道库二进制接口会在 5.0 版本中发生变化,例如 std::string。 - Rob
1个回答

7

我已经在邮件列表上回答过这个问题了,就像Marc所说的那样,它会正常工作。

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


非常感谢您的回答!我会接受它,因为您是libstdc++的权威。如邮件列表所述,如果您能指向任何关于如何实现一致高度ABI兼容性的文档(例如确保内存布局保持一致,内联保持一致等),那么我将不胜感激。 - Rob
@Jonathan Wakely 如果出现这样的情况,即在库内部进行了new/malloc操作,指针以某种方式传播到用户应用程序中,并在那里进行delete/free操作,该怎么办?我见过有多个libc版本和多个内存分配器存在于同一个应用程序中的情况,上述情况可能会导致应用程序崩溃。 - Erik Alapää
@ErikAlapää,拥有多个libc是你的问题,而不是libstdc++的问题。标准规定分配函数是全局的,如果您通过拥有多个不兼容的分配函数违反了“一个定义规则”,那么您需要自己处理它。 - Jonathan Wakely
@JonathanWakely 我想指出这个问题 - 它已经困扰了许多程序员。 - Erik Alapää

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接