显式指定CMake编译器为GCC导致无限循环问题求助
CMake切换编译器时无限循环的问题解决
问题根源
在project()命令之后直接设置CMAKE_C_COMPILER和CMAKE_CXX_COMPILER会触发CMake的自动重新配置机制,进而陷入无限循环:
project()命令会完成编译器的初始化流程,此时CMake已经将默认编译器路径写入缓存;- 后续修改这两个变量时,CMake检测到缓存值与当前设置值不一致,判定配置需要重新运行;
- 重新运行时又会重复执行
project()和变量设置步骤,循环往复。
同时,直接用set()设置这两个变量时,默认不会修改缓存中的值,导致CMake反复检测到"变量变更"的信号。
正确实现方案
要实现"注释几行切换GCC/Clang"的需求,推荐以下两种方式:
方式1:将编译器设置移至project()之前(最稳妥)
把编译器配置放在project()命令执行前,让CMake在初始化项目时直接使用指定的编译器,避免触发重新配置:
cmake_minimum_required(VERSION 3.4.1...3.17.2) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}") # 切换编译器只需注释/取消对应块 set(CMAKE_C_COMPILER "/usr/bin/gcc") set(CMAKE_CXX_COMPILER "/usr/bin/g++") # set(CMAKE_C_COMPILER "/usr/bin/clang") # set(CMAKE_CXX_COMPILER "/usr/bin/clang++") project(test_project C CXX) message(STATUS "Compiler ID: ${CMAKE_CXX_COMPILER_ID}") message(STATUS "Compiler Vers: ${CMAKE_CXX_COMPILER_VERSION}")
方式2:强制覆盖缓存变量(适合必须在project()后设置的场景)
如果需要在project()之后设置编译器,必须用CACHE ... FORCE参数强制修改缓存变量,避免CMake反复检测变更:
cmake_minimum_required(VERSION 3.4.1...3.17.2) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}") project(test_project C CXX) # 切换编译器只需注释/取消对应块 set(CMAKE_C_COMPILER "/usr/bin/gcc" CACHE PATH "C compiler" FORCE) set(CMAKE_CXX_COMPILER "/usr/bin/g++" CACHE PATH "C++ compiler" FORCE) # set(CMAKE_C_COMPILER "/usr/bin/clang" CACHE PATH "C compiler" FORCE) # set(CMAKE_CXX_COMPILER "/usr/bin/clang++" CACHE PATH "C++ compiler" FORCE) message(STATUS "Compiler ID: ${CMAKE_CXX_COMPILER_ID}") message(STATUS "Compiler Vers: ${CMAKE_CXX_COMPILER_VERSION}")
注意:第一次切换编译器时,建议手动删除构建目录下的
CMakeCache.txt和CMakeFiles目录,清除残留缓存后再重新运行cmake。
额外小技巧
如果不想修改CMake脚本,也可以通过命令行参数临时切换编译器:
# 用Clang编译 cmake .. -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ # 用GCC编译 cmake .. -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++
内容的提问来源于stack exchange,提问作者intrigued_66
相关产品推荐
相关产品推荐

