我遇到的问题是由于目标先持有包含路径,然后持有编译器选项。我如何在编译器选项之后设置包含路径以编译目标的源文件?
我的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
。
1条答案
按热度按时间vpfxa7rd1#
相关的CMake变量是
CMAKE_CXX_COMPILE_OBJECT
,它是命令编译对象时使用的模板的配置点,默认值在Modules/CMakeCXXInformation.cmake
中设置,覆盖值在不同的Modules/Platform/*
或Modules/Compiler/*
文件中指定,如果您感兴趣,可以使用以下正则表达式grep覆盖值:set.*CXX_COMPILE_OBJECT
.默认设置如下:
您可能需要这样的内容(在您自己的CMakeLists.txt文件或a toolchain file中设置):
据我所知,这个配置点是"全局的",我不知道如何为不同的目标或源文件指定不同的值。
如果您正在使用Ninja生成器,并且需要此类更改来影响生成的.rsp files,我认为您需要从源代码构建CMake的修改版本,因为该行为似乎被烘焙到二进制文件中,而不是
Modules/
目录中的CMake脚本文件中。相关的源文件是Source/cmNinjaTargetGenerator.cxx
。请查看执行rule.RspContent =
的代码行,然后您将我会看到:您可能需要交换
scanVars.Includes
和scanVars.scanFlags
的顺序。如果您选择创建修改过的CMake二进制文件,请确保您遵循the software licence。