如何让CMake将包含目录标志置于编译器选项之后生成编译命令?
解决CMake编译命令中编译器选项与包含目录的顺序问题
问题原因
CMake对编译参数有固定的分组优先级,默认会将包含目录(-I参数)放在target_compile_options指定的选项之前。AFTER/BEFORE参数仅能调整同组内的参数顺序,无法跨组改变不同类型参数的先后位置。
解决方案
方法一:将选项加入全局编译器Flags
把需要前置的编译选项添加到CMAKE_CXX_FLAGS中,全局Flags会被CMake优先放置在包含目录之前:
project(HelloWorld) cmake_minimum_required(VERSION 3.0) # 把需要前置的选项加入全局CXX Flags set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -cpp -remap") add_library(HELLO_WORLD_LIB STATIC src/helloWorld.cpp ) target_include_directories(HELLO_WORLD_LIB PUBLIC D:\\temp\\includes) set_target_properties(HELLO_WORLD_LIB PROPERTIES OUTPUT_NAME hello ARCHIVE_OUTPUT_DIRECTORY D:\\temp\\CMakeHelloWorld SUFFIX .a )
方法二:自定义目标编译命令模板(推荐,仅影响特定目标)
通过修改目标的COMPILE_OBJECT属性,自定义编译命令的参数顺序,让<FLAGS>(对应编译选项)出现在<INCLUDES>(对应包含目录)之前:
project(HelloWorld) cmake_minimum_required(VERSION 3.0) add_library(HELLO_WORLD_LIB STATIC src/helloWorld.cpp ) target_include_directories(HELLO_WORLD_LIB PUBLIC D:\\temp\\includes) target_compile_options(HELLO_WORLD_LIB PUBLIC -cpp -remap) set_target_properties(HELLO_WORLD_LIB PROPERTIES OUTPUT_NAME hello ARCHIVE_OUTPUT_DIRECTORY D:\\temp\\CMakeHelloWorld SUFFIX .a # 自定义编译命令模板,调整参数顺序 COMPILE_OBJECT "<CMAKE_CXX_COMPILER> <FLAGS> <INCLUDES> -o <OBJECT> -c <SOURCE>" )
验证效果
重新执行你的CMake命令:
call cmake -GNinja -S ./.. -DCMAKE_INSTALL_PREFIX=../_bin call cmake --build . --config Debug --verbose -d keeprsp
生成的编译命令会变成:
[1/2] C:\mingw\test25_comp_8.1.0_testversion\bin\c++.exe -cpp -remap -ID:/temp/includes -MD -MT CMakeFiles/HELLO_WORLD_LIB.dir/src/helloWorld.cpp.obj -MF CMakeFiles\HELLO_WORLD_LIB.dir\src\helloWorld.cpp.obj.d -o CMakeFiles/HELLO_WORLD_LIB.dir/src/helloWorld.cpp.obj -c ../src/helloWorld.cpp
内容的提问来源于stack exchange,提问作者Gowrisankar
相关产品推荐
相关产品推荐

