gpt4 book ai didi

c++ - 发布和调试之间的 ABI 兼容性

转载 作者:太空狗 更新时间:2023-10-29 23:13:41 25 4
gpt4 key购买 nike

当使用 GCC 时,考虑到我有时在发布中有时在调试中编译相同的库,ABI 是否保证兼容?

(同时使用相同的编译器)

我有一个可执行文件和一些共享对象(有些依赖于其他对象),我希望能够在不重新编译所有内容的情况下换出发布/调试共享对象,但是只有感兴趣的共享对象。

这可能吗,或者在某些情况下我可能会通过这种方式获得一些未定义的行为? (假设我的代码是严格打包的,并且在发布和调试时都进行了填充)


编辑:

我将详细说明我们遇到的问题。我们有一个自定义版本的 intrusive_ptr,在 Debug模式下我们有我们自己的 intrusive_ptr,它有一个 单个 成员,它是一个 boost: :intrusive_ptr,在发布中我们简单地使用 boost::intrusive_ptr。我们的intrusive_ptr API 和boost::intrusive_ptr 是一样的,我们的类中没有任何虚函数。
我们看到的是:
如果我们使用所有调试库或所有发布库都可以正常工作。如果我们将调试可执行文件与发布库混合使用,intrusive_ptr 会发生内存泄漏,并且不会释放对象。

我们的 intrusive_ptrboost::intrusive_ptr 的大小在调试和发布时是相同的(我们的类不会在顶部添加任何大小开销)。

所以我想知道是什么导致了泄漏,ABI 差异是唯一想到的事情。

想法?

最佳答案

我知道有几个编译器会为发布和调试生成不兼容的代码(尽管这些编译器早就被弃用了)。在表面上,我不相信对象模块是完全兼容的,除非它们是用完全相同的标志编译的。

这就是为什么 makefile(遵循 GNU 原则)和像 Eclipse 这样的 IDE 将发布/调试/配置文件对象构建到不同的目录中。以确保它们永远不会混淆。

关于c++ - 发布和调试之间的 ABI 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37548279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com