CMake 3.11如何清除目标编译选项?移除-Wconversion遇报错
解决CMake 3.11中清空目标COMPILE_OPTIONS时报错的问题
这个问题我之前也碰到过,CMake 3.11对空列表的处理确实有点坑——当你试图把COMPILE_OPTIONS设为空列表时,参数展开后会直接消失,导致set_target_properties因为参数数量不对报错。下面给你两种可行的解决办法:
方法一:用引号包裹空列表,传递空字符串
修改你原来的代码,给变量加上引号,这样即使列表为空,也会传递一个空字符串给COMPILE_OPTIONS,CMake就能正确识别了:
get_target_property(EXTLIB_COMPILE_FLAGS ext_lib COMPILE_OPTIONS) list(REMOVE_ITEM EXTLIB_COMPILE_FLAGS -Wconversion) # 关键:用引号包裹变量,确保空列表被当作空字符串传递 set_target_properties(ext_lib PROPERTIES COMPILE_OPTIONS "${EXTLIB_COMPILE_FLAGS}")
原理是CMake在处理不带引号的空变量时,会直接忽略它,导致set_target_properties的命令变成set_target_properties(ext_lib PROPERTIES COMPILE_OPTIONS),少了属性值;而加引号后,空变量会被解析成空字符串,符合命令的语法要求。
方法二:引入外部库前临时禁用编译选项
如果这个外部库是通过add_subdirectory或find_package引入的,你可以在引入它之前暂时移除-Wconversion选项,引入完成后再恢复:
# 保存当前全局CXX编译选项 set(ORIGINAL_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # 移除-Wconversion string(REPLACE "-Wconversion" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # 引入外部库(根据你的实际情况调整) add_subdirectory(third_party/ext_lib) # 或者 find_package(ext_lib REQUIRED) # 恢复原来的全局编译选项 set(CMAKE_CXX_FLAGS ${ORIGINAL_CXX_FLAGS})
这种方法适合外部库没有自定义编译选项,完全继承全局CMAKE_CXX_FLAGS的场景,能从根源上避免该库触发-Wconversion的警告。
注意:target_compile_options的REMOVE参数是CMake 3.13才新增的特性,所以在3.11版本里没法用这个更简洁的方式,只能用上面两种方法。
内容的提问来源于stack exchange,提问作者Ivan Pankov
相关产品推荐
相关产品推荐

