我最近花了相当长时间追查问题,最终发现是使用-D_GLIBCXX_DEBUG
编译库(告诉libstdc++使用带有额外检查的标准库的调试版本),但没有使用此选项编译客户端程序所致。这导致ABI兼容性问题。
是否有一种方式可以使用GCC自动检测到类似的问题?Visual Studio提供了detect_mismatch
pragma,我认为这将达到这个目的,但我不知道是否有GCC等效的方法。GCC会嵌入一个符号名(例如GLIBCXX_3.4.9
),我可以想象一些方案会因为不存在相应的符号(例如mylib_debug_stl
)而导致链接错误,但我能想到的唯一获取该符号的方法都很巧妙。
或者,其他人如何避免这个问题?构建已检查版本的库并使用不同的名称或类似方法?