如何在GCC使用-O0编译时调用libstdc++发行版运行库
我有一段教学用代码,故意让标准库函数触发越界访问,运行时出现如下断言错误:
/usr/src/debug/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:1221:
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator [with _CharT =
char; _Traits = std::char_traits; _Alloc = std::allocator ; reference = char&;
size_type = long unsigned int]: Assertion '__pos <= size()' failed.
该断言仅存在于libstdc的调试版本中(路径包含/usr/src/debug/)。当前使用GCC 12.2.0编译时,-O0会调用调试版libstdc,而-O1/O2则调用发行版。请问能否配置GCC在使用-O0时调用发行版libstdc++?
可以通过以下几种方式实现-O0编译时链接发行版libstdc++:
直接指定发行版库路径
编译时用-L参数指定系统中发行版libstdc++的安装路径(通常是/usr/lib/x86_64-linux-gnu这类路径),再加上-lstdc++明确链接发行版库:g++ -O0 -L/usr/lib/x86_64-linux-gnu -lstdc++ your_code.cpp -o your_program注意要确保指定的路径下是发行版的
libstdc++.so文件。禁用调试宏
libstdc++的调试断言依赖_GLIBCXX_DEBUG等宏,编译时添加-U_GLIBCXX_DEBUG取消调试宏定义,同时可以加上-D_GLIBCXX_RELEASE强制启用发行版行为:g++ -O0 -U_GLIBCXX_DEBUG -D_GLIBCXX_RELEASE your_code.cpp -o your_program这种方式不需要修改库路径,直接通过宏控制标准库的行为模式。
显式链接发行版库文件
如果知道发行版libstdc++的具体路径,编译时直接指定库文件路径:g++ -O0 your_code.cpp -o your_program /usr/lib/x86_64-linux-gnu/libstdc++.so
内容的提问来源于stack exchange,提问作者Cedric Martens

