检测与GCC的ABI兼容性问题

Eva*_*nED 9 debugging gcc glibc g++ abi

我最近花了相当多的时间来追踪一个问题,原因是编译了一个库-D_GLIBCXX_DEBUG(告诉libstdc ++使用带有额外检查的标准库的调试版本),但没有编译客户端程序.这导致了ABI兼容性问题.

有什么方法可以通过GCC自动检测这样的问题吗?Visual Studio提供了我认为可以用于此目的的detect_mismatch编译指示,但我不知道任何GCC等价物.GCC通过嵌入符号名称(例如GLIBCXX_3.4.9)做了一些事情,我可以想象如果相应的符号(例如mylib_debug_stl)不存在则会因为未定义的符号而导致链接错误的方案,但是我能想到的唯一方法是使用那个符号真是太烂了.

或者,其他人如何避免这个问题?将库的已检查版本构建为不同的名称或类似的名称?

Jon*_*ely 4

有什么方法可以自动检测 GCC 的此类问题吗?

只有链接器才能检测到您是否链接了不兼容的代码,而编译器则无法检测到。

替代链接器gold可以检测该--detect-odr-violations选项的一些问题。

或者,其他人如何避免这个问题?将库的检查版本构建为不同的名称或类似的名称?

我只是确保当我想使用调试模式时重建所有内容,我认为我不想保留使用调试模式构建的库。它的目的是为了调试,而不是为了正常使用。

反正我很少使用-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;
  // ...
};
Run Code Online (Sandbox Code Playgroud)

然后,当我想要为该特定类使用调试模式向量时,我会更改预处理器条件,而不影响程序中的每个容器。因为更改涉及写入文件(并因此更新其时间戳),所以依赖于该标头的任何内容都将由 重建make,并且有两种不同的类型std::vector<int>__gnu_debug::vector<int>,它们具有不同的符号,并且不会被链接器混淆。

只是定义_GLIBCXX_DEBUG不会导致所有依赖项被重建,并且默默地全局更改定义std::vector,而不是将特定容器更改为具有不同名称的不同类型,__gnu_debug::vector