CMake中add_compile_options设置的编译选项未生效问题排查
CMake add_compile_options不生效问题排查
复现配置
测试用CMakeLists.txt内容:
add_compile_options(-Wall) MESSAGE("COMPILE OPTIONS ${COMPILE_OPTIONS}") add_executable(test main.cpp)
测试用main.cpp仅包含空main函数。
执行的构建命令序列:
rm -r CMakeFiles/ cmake_install.cmake Makefile test CMakeCache.txt cmake CMakeLists.txt make VERBOSE=1
异常表现
- CMake配置阶段打印
COMPILE OPTIONS后内容为空,未输出预期的-Wall - make阶段的详细编译、链接指令中未出现
-Wall参数,对应输出片段:
<snip> [100%] Linking CXX executable test /a_path/cmake -E cmake_link_script CMakeFiles/test.dir/link.txt --verbose=1 /usr/bin/c++ -L/a/libdir -L/another/libdir -rdynamic CMakeFiles/test.dir/main.o -o test <snip>
测试环境CMake版本为3.15.3。
问题根因
你的操作存在两处认知和用法错误:
- 对
add_compile_options的作用对象理解错误add_compile_options不会对名为COMPILE_OPTIONS的全局CMake变量赋值,它的作用是修改当前目录的COMPILE_OPTIONS目录属性,给后续在该目录(及子目录)下定义的构建目标追加编译选项,编译选项最终存储在每个目标的COMPILE_OPTIONS目标属性中,直接打印同名普通变量必然得到空值。 - CMake配置命令传参错误
cmake命令的位置参数要求传入源码目录路径(即包含CMakeLists.txt的文件夹路径),不能直接传入CMakeLists.txt文件路径。你执行的cmake CMakeLists.txt属于非法传参,会导致CMake生成构建规则时出现异常,你配置的编译选项不会被正确写入编译命令中。
修正方案
- 修正CMake配置命令:在源码目录下执行配置时,传入当前目录路径即可,即把
cmake CMakeLists.txt改为cmake .;更推荐新建独立build目录执行out-of-source构建,避免污染源码目录。 - 若要验证编译选项是否添加成功,不要打印全局变量,可在定义目标后读取目标属性查看,示例代码:
add_compile_options(-Wall) add_executable(test main.cpp) get_target_property(test_opts test COMPILE_OPTIONS) message("test目标的编译选项:${test_opts}")
- 清理全部构建缓存后重新执行配置、编译流程,即可在g++的编译参数中看到
-Wall选项。
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

