CentOS 6.9编译CMake 3.5.0时make install提示GLIBCXX版本缺失求助
问题原因分析
这个报错的核心原因是sudo执行命令时会重置环境变量,导致你普通用户下配置的LD_LIBRARY_PATH并没有被sudo继承。虽然你在普通用户环境中把/usr/local/lib64放在了/usr/lib64前面,但sudo默认会清理大部分自定义环境变量,使用一套更安全的系统级环境配置——这时候系统还是会优先去/usr/lib64找旧版本的libstdc++.so.6,而这个旧库缺少CMake 3.5.0需要的GLIBCXX_3.4.15和GLIBCXX_3.4.21版本,所以触发了报错。
解决方案
下面提供几种可行的解决办法,按推荐程度排序:
1. 临时指定sudo的环境变量(最安全快捷)
直接在sudo命令中显式传递LD_LIBRARY_PATH,让make install过程使用你指定的高版本库:
sudo LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH make install
2. 配置sudo保留LD_LIBRARY_PATH(长期生效)
如果需要频繁用sudo调用依赖该库的程序,可以修改sudo配置让它保留LD_LIBRARY_PATH:
- 用
visudo编辑/etc/sudoers(必须用visudo,避免语法错误导致sudo失效) - 添加一行配置:
Defaults env_keep += "LD_LIBRARY_PATH" - 保存退出后,后续sudo命令就会继承当前用户的
LD_LIBRARY_PATH了
3. 替换系统默认的libstdc++.so.6链接(需谨慎)
把系统默认的libstdc++.so.6软链接指向你安装的高版本库:
- 先备份原链接:
sudo mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.old - 创建新的软链接:
sudo ln -s /usr/local/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6
注意:这种方式可能影响系统中依赖旧版本libstdc++的程序(比如部分系统自带工具),操作前请确认风险。
4. 编译时指定链接库(从源头解决)
如果重新编译CMake,可以在cmake配置阶段就指定链接到高版本的libstdc++:
cmake -DCMAKE_EXE_LINKER_FLAGS="-L/usr/local/lib64 -lstdc++" ../cmake-3.5.0
然后再执行make和sudo make install,这样编译出来的CMake程序会直接绑定到你指定的库,后续执行时就不会依赖系统默认库了。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

