CMake项目中如何移除自动生成文件内的指定编译选项?
解决CMake中移除INTERFACE_COMPILE_OPTIONS后Ninja仍保留选项的问题
你的需求完全可行,出现这种情况大概率是忽略了以下几个关键点:
1. 修改属性的时机不对
CMake的目标属性修改需要在目标定义之后、所有依赖该目标的代码之前执行。如果你的CMakeLists.txt中,依赖slc_empty_cpp的目标(比如业务可执行文件/库)是在修改INTERFACE_COMPILE_OPTIONS之前定义的,那么这些依赖目标已经提前继承了-mthumb选项,后续修改接口属性不会同步更新已生成的目标配置。
正确的顺序应该是:
# 先引入自动生成的配置文件,此时slc_empty_cpp目标被定义 include(empty_cpp.cmake) # 立即修改slc_empty_cpp的接口编译选项 get_target_property(_current_opts slc_empty_cpp INTERFACE_COMPILE_OPTIONS) list(REMOVE_ITEM _current_opts "-mthumb") set_target_properties(slc_empty_cpp PROPERTIES INTERFACE_COMPILE_OPTIONS "${_current_opts}") # 之后再定义依赖该目标的业务代码 add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE slc_empty_cpp)
2. -mthumb可能通过其他渠道设置
empty_cpp.cmake里可能不止通过INTERFACE_COMPILE_OPTIONS添加-mthumb:
- 可能用
add_compile_options("-mthumb")全局设置,此时所有C/C++目标都会继承这个选项; - 可能直接修改了
CMAKE_CXX_FLAGS或CMAKE_C_FLAGS变量,把-mthumb加进了全局编译标志。
你可以在CMake配置时打印这些变量确认:
message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
如果确实存在,直接替换移除:
string(REPLACE "-mthumb" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") string(REPLACE "-mthumb" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
3. 旧缓存未清理导致配置残留
CMake会缓存之前的配置,即使你修改了CMakeLists.txt,旧的缓存可能还保留着-mthumb的设置。解决方法是:
- 完全删除build目录下的
CMakeCache.txt; - 或者直接删除整个build目录,重新运行
cmake ..生成配置。
4. 依赖目标自身也添加了该选项
如果你的业务目标自己通过target_compile_options添加了-mthumb,那么即使接口选项被移除,目标自身的选项依然会生效。此时需要直接修改业务目标的属性:
get_target_property(_app_opts MyApp COMPILE_OPTIONS) list(REMOVE_ITEM _app_opts "-mthumb") set_target_properties(MyApp PROPERTIES COMPILE_OPTIONS "${_app_opts}")
按照上面的步骤排查调整,就能彻底移除-mthumb选项。
内容的提问来源于stack exchange,提问作者Jack HerRrer
相关产品推荐
相关产品推荐

