如何让CMake正确使用devtoolset-9的G++编译器?
解决CentOS 7下CMake使用devtoolset-9编译器的问题
核心原因
CMake会缓存第一次配置时的编译器信息,后续修改CMakeLists.txt里的编译器路径可能无法覆盖缓存;另外scl enable的环境变量传递可能未正确生效。
解决方案
1. 清理CMake缓存(必须步骤)
先删除构建目录下的所有缓存文件,避免旧配置干扰:
rm -rf build/* # 假设构建目录为build # 或直接删除并重建构建目录 rm -rf build && mkdir build
2. 正确使用scl环境启动CMake
scl enable需要启动完整shell会话让环境变量生效,执行以下命令:
scl enable devtoolset-9 bash # 进入新shell后切换到构建目录执行CMake cd build cmake ..
此操作会将devtoolset-9的gcc/g++加入PATH最前端,CMake会自动识别新版本编译器。
3. 命令行手动指定编译器(scl方式无效时用)
CMakeLists.txt中set(CMAKE_CXX_COMPILER)需在project()命令前才生效,若项目顶层CMakeLists.txt开头就有project(),会导致你的设置被覆盖。此时直接在cmake命令行指定编译器:
cd build cmake .. -DCMAKE_C_COMPILER=/opt/rh/devtoolset-9/root/bin/gcc -DCMAKE_CXX_COMPILER=/opt/rh/devtoolset-9/root/bin/g++
这种方式优先级最高,会强制CMake使用指定编译器。
4. 验证编译器是否生效
配置完成后,查看CMake缓存确认:
grep "CMAKE_CXX_COMPILER" build/CMakeCache.txt
输出应显示/opt/rh/devtoolset-9/root/bin/g++,也可直接验证当前环境的编译器版本:
g++ --version
额外注意
- 避免在CMakeLists.txt中硬编码编译器路径,优先使用环境变量或命令行参数,提升项目通用性。
- devtoolset-9的环境变量仅在当前scl shell会话生效,若需永久生效可将
scl enable devtoolset-9 bash加入~/.bashrc,但不推荐,防止影响依赖旧编译器的其他项目。
内容的提问来源于stack exchange,提问作者codesling
相关产品推荐
相关产品推荐

