我最近花了相当多的时间来追踪一个问题,该问题原来是由 -D_GLIBCXX_DEBUG
编译库引起的。 (它告诉 libstdc++ 使用带有额外检查的标准库的调试版本)但不编译客户端程序。这导致了 ABI 兼容性问题。
有什么方法可以用 GCC 自动检测这样的问题吗? Visual Studio 提供了 detect_mismatch
pragma我认为这可以达到这个目的,但我不知道任何 GCC 等价物。 GCC 做了一些嵌入符号名称(例如 GLIBCXX_3.4.9
)的事情,我可以想象如果相应的符号(例如 mylib_debug_stl
)不存在,由于 undefined symbol 会导致链接错误的方案,但我唯一的方法能想到去使用那个符号真的很hacky。
或者,其他人如何避免这个问题?将库的检查版本构建为不同的名称或类似的名称?
最佳答案
Is there some way I can automatically detect problems like this with GCC?
只有链接器可以检测您是否链接了不兼容的代码,而不是编译器。
替代链接器,
gold
,可以检测--detect-odr-violations
的一些问题选项。Alternatively, how do other people avoid this issue? Build the checked version of the library to a different name or something like that?
我只是确保在我想使用 Debug模式时重建所有内容,我认为我从未想要保留一个使用 Debug模式构建的库。它用于调试,而不是用于正常使用。
我很少用
-D_GLIBCXX_DEBUG
无论如何,我更经常做这样的事情:#if 0
# include <debug/vector>
namespace my_class_stl = __gnu_debug;
#else
#include <vector>
namespace my_class_stl = std;
#endif
struct my_class
{
typedef my_class_stl::vector<int> container;
typedef container::iterator iterator;
// ...
};
然后,当我想对该特定类使用 Debug模式向量时更改预处理器条件,而不影响 每程序中的容器。因为更改涉及写入文件(并因此更新其时间戳),因此任何依赖于该 header 的内容都将被
make
重建。 ,并且有两种不同的类型,std::vector<int>
和 __gnu_debug::vector<int>
,它们具有不同的符号并且不会被链接器混淆。只是定义
_GLIBCXX_DEBUG
不会导致重新构建所有依赖项,并且会默默地更改 std::vector
的定义全局,而不是将特定容器更改为具有不同名称的不同类型,__gnu_debug::vector
关于debugging - 使用 GCC 检测 ABI 兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12629255/