CentOS7下使用devtoolset-10升级GLIBCXX时动态库链接异常问题
问题原因
source /opt/rh/devtoolset-10/enable脚本仅会修改PATH、CPATH、MANPATH等环境变量,用于指定高版本编译器、头文件的搜索路径,默认不会修改动态链接器的库搜索路径LD_LIBRARY_PATH,也不会替换系统默认的libstdc++.so软链接。- devtoolset的核心设计目标是编译出可在原生CentOS 7环境运行的二进制,因此默认采用「高版本新增符号静态编译、基础符号依赖系统旧
libstdc++.so」的混合链接机制,所以默认就会链接/lib64/libstdc++.so.6。 - 当项目用到了高版本libstdc才支持的特性(如C17/20新API、新符号)时,默认的混合链接机制无法覆盖所有新增符号,就会出现编译或运行时的符号缺失问题。
解决方法
根据是否需要兼容未安装devtoolset的原生CentOS 7环境,可选择以下两种方案:
方案1:保留系统兼容性
编译时给g添加编译参数 -static-libstdc++ -static-libgcc,该参数会把所有高版本libstdc的符号静态打包到二进制文件中,编译出的程序可以直接在原生CentOS 7环境运行,缺点是二进制体积会增大1~2MB。
方案2:强制动态链接devtoolset提供的高版本libstdc++.so
适合运行环境和编译环境一致、不需要兼容原生CentOS 7的场景,可按需选择生效范围:
临时生效(仅当前终端窗口)
执行完enable脚本后额外配置LD_LIBRARY_PATH:
source /opt/rh/devtoolset-10/enable export LD_LIBRARY_PATH=/opt/rh/devtoolset-10/root/usr/lib64:/opt/rh/devtoolset-10/root/usr/lib:$LD_LIBRARY_PATH
当前用户永久生效
将以下内容添加到~/.bashrc文件末尾,之后执行source ~/.bashrc生效:
source /opt/rh/devtoolset-10/enable export LD_LIBRARY_PATH=/opt/rh/devtoolset-10/root/usr/lib64:/opt/rh/devtoolset-10/root/usr/lib:$LD_LIBRARY_PATH
全局永久生效(所有用户)
将上述两行内容写入/etc/profile.d/devtoolset-10.sh文件,保存后执行source /etc/profile即可全局生效。
内容的提问来源于stack exchange,提问作者Double_Mind
相关产品推荐
相关产品推荐

