有什么方法可以用 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;
// ...
};
然后,当我想为该特定类使用调试模式向量时,我会更改预处理器条件,而不影响程序中的每个容器。因为更改涉及写入文件(并因此更新其时间戳)任何依赖于该标头的内容都将由 重建make
,并且有两种不同的类型std::vector<int>
和__gnu_debug::vector<int>
,它们具有不同的符号并且不能被链接器混淆。
只是定义_GLIBCXX_DEBUG
不会导致所有依赖项都被重建,并且会默默地改变std::vector
全局的定义,而不是将特定的容器更改为具有不同名称的不同类型,__gnu_debug::vector