Max*_*rin 5 c++ gcc compilation abi shared-ptr
使用 GCC 时,考虑到我有时在发布时编译相同的库,有时在调试时编译相同的库,ABI 是否保证兼容?
(同时使用相同的编译器)
我有一个可执行文件和一些共享对象(有些依赖于其他对象),我希望能够交换发布/调试共享对象,而无需重新编译所有内容,而只重新编译感兴趣的共享对象。
这是可能的,还是在某些情况下我可能会以这种方式获得一些未定义的行为?(假设我的代码被严格打包,并在发布和调试中填充)
编辑:
我将详细说明我们看到的问题。我们有一个自定义版本intrusive_ptr,在调试模式下,我们有自己intrusive_ptr的一个成员,即 a boost::intrusive_ptr,而在发布中,我们只使用boost::intrusive_ptr. 我们的 APIintrusive_ptr与 相同boost::intrusive_ptr,并且我们在类中没有任何虚函数。
我们看到的是:
如果我们使用所有调试库或所有发布库,则一切正常。如果我们将调试可执行文件与发布库混合使用,则会发生内存泄漏,intrusive_ptr并且不会释放对象。
我们intrusive_ptr和的大小boost::intrusive_ptr在调试和发布中都是相同的(我们的类不会在顶部添加任何大小开销)。
所以我想知道是什么导致了泄漏,ABI 差异是唯一想到的事情。
想法?
我知道一些编译器会生成不兼容的代码以供发布和调试(尽管这些编译器早已被弃用)。表面上,我不相信对象模块完全兼容,除非它们是使用完全相同的标志进行编译的。
这就是为什么 makefile(遵循 GNU 原则)和 IDE(如 Eclipse)将发布/调试/配置文件对象构建到不同的目录中。以确保它们永远不会混淆。