You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:56:06