CMAKE_C_COMPILER_ID匹配规则及CMake优先选Clang失败问题排查
CMAKE_C_COMPILER_ID MATCHES "Clang|GNU" 工作逻辑 CMAKE_C_COMPILER_ID是CMake执行project()指令时自动检测填充的C编译器标识字符串,不同编译器对应固定的标识值:Clang编译器对应值为Clang,GCC编译器对应值为GNU。MATCHES是CMake的正则匹配运算符,后面的"Clang|GNU"是正则表达式,|代表或逻辑,只要CMAKE_C_COMPILER_ID的值匹配两个字符串中的任意一个,整个判断条件就成立。- 你当前代码里的这段判断作用是:当检测到编译器为Clang或者GCC时,就给C编译选项追加C99标准要求、语法严谨性检查、地址消毒、未定义行为消毒、开启所有警告这类编译参数。
实现优先选用Clang、不存在则用GCC的方案
你当前的CMakeLists.txt没有指定编译器优先级逻辑,CMake原生默认的编译器检测顺序优先匹配系统PATH中的gcc,所以会默认选GCC。要实现你的需求,需要在project()指令前添加编译器优先级查找逻辑,因为project()执行时就会完成编译器检测,相关配置必须放在它前面:
cmake_minimum_required (VERSION 2.8.12) # 优先查找Clang编译器,找不到再自动匹配GCC find_program(CMAKE_C_COMPILER NAMES clang gcc) if(NOT CMAKE_C_COMPILER) message(FATAL_ERROR "未找到可用的C编译器(Clang/GCC)") endif() project (leptjson_test C) if (CMAKE_C_COMPILER_ID MATCHES "Clang|GNU") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -pedantic -fsanitize=address -fsanitize=undefined -Wall") # 补充链接器消毒参数,避免低版本编译器出现运行时错误 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address -fsanitize=undefined") endif() add_library(leptjson leptjson.c) add_executable(leptjson_test test.c) target_link_libraries(leptjson_test leptjson)
注意:修改配置后首次构建需要清空之前的CMake缓存(删除build目录下的所有内容)再执行cmake命令,否则旧的编译器缓存配置不会生效。如果需要临时指定编译器,也可以直接在执行cmake时传参:
cmake .. -DCMAKE_C_COMPILER=clang,该方式优先级最高。
内容的提问来源于stack exchange,提问作者douyu
相关产品推荐
相关产品推荐

