我如何告诉CMake在它的对象编译命令中把include目录标志放在编译器选项标志之后?

cyvaqqii  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(170)

我遇到的问题是由于目标先持有包含路径,然后持有编译器选项。我如何在编译器选项之后设置包含路径以编译目标的源文件?
我的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
    )

我的电话:

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

vpfxa7rd

vpfxa7rd1#

相关的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>")

据我所知,这个配置点是"全局的",我不知道如何为不同的目标或源文件指定不同的值。
如果您正在使用Ninja生成器,并且需要此类更改来影响生成的.rsp files,我认为您需要从源代码构建CMake的修改版本,因为该行为似乎被烘焙到二进制文件中,而不是Modules/目录中的CMake脚本文件中。相关的源文件是Source/cmNinjaTargetGenerator.cxx。请查看执行rule.RspContent =的代码行,然后您将我会看到:

rule.RspContent =
  cmStrCat(' ', scanVars.Defines, ' ', scanVars.Includes, ' ', scanFlags);

您可能需要交换scanVars.IncludesscanVars.scanFlags的顺序。
如果您选择创建修改过的CMake二进制文件,请确保您遵循the software licence

相关问题