CMake 3.20+自动添加-MD/-MT/-MF编译选项无法移除问题
问题原因
CMake 3.20起存在明确的行为变更:只要编译器被识别为GNU系列,就会自动在编译命令中追加用于生成头文件依赖的-MD -MT -MF三个GNU专属参数,这几个参数不属于CMAKE_C_FLAGS/CMAKE_CXX_FLAGS的管控范围,无法通过修改这两个常规编译选项变量移除。3.20正式版发布前,这些参数默认不会被自动添加到编译命令中。
你当前的配置虽然显式写了set(CMAKE_C_COMPILER customCCompiler)指定自定义编译器,但CMake的自动编译器检测流程仍然将其判定为GNU 9.4.0——从配置阶段输出的第一行The C compiler identification is GNU 9.4.0可以直接确认。既然被归类为GNU编译器,CMake就会按照GCC的行为规则自动注入那三个依赖生成参数,你的自定义编译器不识别-MD选项,就触发了对应的警告。
复现所用CMakeLists.txt内容
cmake_minimum_required(VERSION 3.20) project(TEST_SUITE) set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_C_COMPILER customCCompiler) set(CMAKE_CXX_COMPILER customCXXCompiler) add_compile_options(-fjust-one-option) add_link_options(-ltest) file(GLOB C_C_FILES "/a/path/to/*.c") foreach(file ${C_C_FILES}) cmake_path(GET file STEM LAST_ONLY title) add_executable(${title} ${file}) endforeach()
配置阶段输出
执行cmake /path/to/CMakeLists.txt命令配置项目时,输出信息如下:
-- The C compiler identification is GNU 9.4.0 -- The CXX compiler identification is GNU 9.4.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /home/user/path
编译阶段异常现象
实际编译时,编译命令中自动出现了未手动配置的-MD -MT -MF选项,触发自定义编译器警告:
[ 25%] Building C object CMakeFiles/fenv.dir/a/path/fev.c.o customCCompiler -fjust-one-option -MD -MT CMakeFiles/fenv.dir/a/path/fev.c.o -MF CMakeFiles/fenv.dir/a/path/fev.c.o.d -o CMakeFiles/fenv.dir/a/path/fev.c.o -c /a/path/fev.c warning: unsupported option -MD
解决方法
- 优先方案:执行CMake配置命令时追加参数,跳过编译器自动检测流程,明确指定自定义编译器的厂商信息,避免CMake将其误判为GNU系列编译器,从根源上阻止GNU专属参数被自动注入。
- 适配方案:如果自定义编译器本身支持依赖文件生成,只是参数语法和GCC不一致,可以手动设置CMake对应的依赖生成规则变量,替换默认的GNU风格参数;如果自定义编译器完全不支持依赖生成,直接关闭CMake的编译期自动依赖生成功能即可,相关参数就不会被追加到编译命令中。
内容的提问来源于stack exchange,提问作者Laurenţiu Terţan
相关产品推荐
相关产品推荐

