CMake中如何在内部检测编译器是否存在并选择该编译器(无需外部配置)
CMake中如何在内部检测编译器是否存在并选择该编译器(无需外部配置)
我来分享几个在CMakeLists.txt内部搞定编译器检测和设置的靠谱方法,完全不用依赖外部环境变量、工具链文件或者额外的CMake参数,还能避开已废弃的CMakeForceCompiler:
方法一:用find_program检测编译器是否存在(最常用)
这是CMake官方推荐的标准方式,通过find_program查找系统里的编译器可执行文件,找到后直接设置对应的编译器变量就行。而且设置后CMake会自动帮你处理后续的工具链相关变量(比如编译器标识、版本信息这类),不用手动操心。
注意:所有编译器设置必须放在project()命令之前,因为project会触发CMake的编译器初始化流程。
代码示例:
# 检测clang和clang++是否存在 find_program(CLANG_EXISTS clang) find_program(CLANGXX_EXISTS clang++) # 如果都找到,就设置为当前项目的编译器 if(CLANG_EXISTS AND CLANGXX_EXISTS) set(CMAKE_C_COMPILER "clang") set(CMAKE_CXX_COMPILER "clang++") endif() # 之后再初始化项目 project(MyProject C CXX)
如果希望找不到目标编译器时直接报错,而不是回退到默认编译器,可以加个提示:
if(NOT CLANG_EXISTS OR NOT CLANGXX_EXISTS) message(FATAL_ERROR "需要的Clang编译器未找到,请先安装!") endif()
方法二:用try_compile验证编译器能否正常工作
如果想确保编译器不仅存在,还能正常编译代码(避免某些环境下编译器存在但无法运行的情况),可以用try_compile做一次实际的编译测试。
首先准备一个简单的测试源文件(比如dummy.c),内容可以是:
int main() { return 0; }
然后在CMakeLists.txt里这样写:
# 设置测试编译的目标类型为静态库,加快检测速度(不用生成可执行文件) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # 尝试用clang编译测试文件,验证是否可用 try_compile(CLANG_WORKS ${CMAKE_BINARY_DIR}/clang_test SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/dummy.c CMAKE_FLAGS -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ) # 如果测试通过,就设置编译器 if(CLANG_WORKS) set(CMAKE_C_COMPILER "clang") set(CMAKE_CXX_COMPILER "clang++") endif() project(MyProject C CXX)
为什么不推荐用CMakeForceCompiler?
你提到的CMakeForceCompiler确实看起来符合需求,但它已经被CMake官方废弃了。强制设置编译器会跳过CMake的正常检测流程,导致很多自动推导的工具链变量(比如CMAKE_C_COMPILER_ID、CMAKE_C_COMPILER_VERSION)无法正确生成,后续的编译选项、平台适配都可能出问题,所以强烈不建议使用。
备注:内容来源于stack exchange,提问作者Supreme Machine
相关产品推荐
相关产品推荐

