【问题标题】:set include paths after the compiler options in target - cmake在目标中的编译器选项之后设置包含路径 - cmake
【发布时间】:2023-02-18 12:25:18
【问题描述】:

我面临的问题是目标首先包含包含路径,然后是编译器选项,我的问题是,如何在目标中的编译器选项之后设置包含路径? 我的 CMakeLists.txt 文件:

project(HelloWorld)
cmake_minimum_required(VERSION 3.0)
add_library(HELLO_WORLD_LIB
                STATIC
                src/helloWorld.cpp
    )
target_include_directories(
            HELLO_WORLD_LIB AFTER PUBLIC D:\\temp\\includes 
        )
target_compile_options(HELLO_WORLD_LIB BEFORE PUBLIC -cpp -remap)
set_target_properties(HELLO_WORLD_LIB
        PROPERTIES
            OUTPUT_NAME hello
            ARCHIVE_OUTPUT_DIRECTORY  D:\\temp\\CMakeHelloWorld
            SUFFIX .a
    )

我的 cmake 电话:

call cmake -GNinja -S ./.. -DCMAKE_INSTALL_PREFIX=../_bin
call cmake --build . --config Debug --verbose -d keeprsp
call cmake --install .

控制台输出:

-- Configuring done
-- Generating done
-- Build files have been written to: D:/temp/CMakeHelloWorld/_build
[1/2] C:\mingw\test25_comp_8.1.0_testversion\bin\c++.exe -ID:/temp/includes -cpp -remap -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
[2/2] cmd.exe /C "cd . && C:\toolbase\_ldata\cmake\.8-3.20.2\bin\cmake.exe -E rm -f ..\libhello.a && C:\mingw\test25_comp_8.1.0_testversion\bin\ar.exe qc ..\libhello.a  CMakeFiles/HELLO_WORLD_LIB.dir/src/helloWorld.cpp.obj && C:\toolbase\mingw\test25_comp_8.1.0_testversion\bin\ranlib.exe ..\libhello.a && cd ."
-- Install configuration: ""

但是,如果我尝试在编译器选项之后添加包含路径,它位于编译器选项之前。有人可以帮我在包含目录之前设置编译器选项吗?喜欢C:\toolbase\mingw\test25_comp_8.1.0_testversion\bin\c++.exe -cpp -remap -ID:/temp/includes

谢谢。

【问题讨论】:

  • 你为什么要这个?它对事物的编译方式有何不同?你想解决什么问题?

标签: cmake build include-path ninja compileoptions


【解决方案1】:

相关的CMake变量是CMAKE_CXX_COMPILE_OBJECT,这是编译对象的命令使用什么模板的配置点。默认值在Modules/CMakeCXXInformation.cmake 中设置,覆盖在各种Modules/Platform/*Modules/Compiler/* 文件中指定。如果您好奇,可以使用以下正则表达式 grep 查找覆盖:set.*CXX_COMPILE_OBJECT

默认的是这样设置的:

set(CMAKE_CXX_COMPILE_OBJECT
  "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")

您可能想要这样的东西(将其设置在您自己的 CMakeLists.txt 文件中,或在 a toolchain file 中):

set(CMAKE_CXX_COMPILE_OBJECT
  "<CMAKE_CXX_COMPILER> <DEFINES> <FLAGS> <INCLUDES> -o <OBJECT> -c <SOURCE>")

【讨论】: