CMake 正在删除预处理器定义

CMake is dropping a preprocessor definition

本文关键字:处理器 定义 预处理 删除 CMake      更新时间:2023-10-16

cmake --build _build output

警告:不能传递包含"#"的预处理器定义 编译器命令行,因为许多编译器不支持它。CMake 正在删除预处理器定义:BUILD_HOST="Linux cvuppala-bri-vm 2.6.32-573.7.1.el6.x86_64 #1 SMP 周二 9 月 22 日 22:00:00 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux" 考虑定义宏 在(配置的(头文件中。

获取主机

对应的代码 CMAKE 代码片段

execute_process( 命令 uname -a WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE BUILD_HOST OUTPUT_STRIP_TRAILING_WHITESPACE ) add_definitions(-DBUILD_HOST="${BUILD_HOST}"(

问题是命令uname -a输出包含"#"。即使字符串被引用,我想知道为什么 cmake 禁止它。

但是,要解决此问题,您应该在添加定义之前删除"#"或将"#"替换为BUILD_HOST的另一个字符。

string(REGEX REPLACE "#"
"" BUILD_HOST
${BUILD_HOST})

这将从BUILD_HOST字符串中删除"#"。

如果要执行替换而不是删除,请尝试以下操作:

string(REGEX REPLACE "#"
"$" BUILD_HOST
${BUILD_HOST})

这会将"#">替换为"$"。


编辑:

我认为不可能通过add_definitions添加包含"#"的定义。但是,如果必须按原样传递结果,则可以手动添加编译选项。

set(EXTRA_COMPILE_OPTIONS -DBUILD_HOST="${BUILD_HOST}")
target_compile_options(${PROJECT_NAME} PRIVATE ${EXTRA_COMPILE_OPTIONS})

答案是使用响应文件为编译器设置额外的命令行选项:

第 1 步:

创建响应文件模板,在本例中称为extra_options.rsp.in

-DBUILD_HOST="@RESULT_OF_UNAME@"

第 2 步:

在 cmakelists.txt 文件中配置此文件:

execute_process(COMMAND "uname" "-a" 
OUTPUT_VARIABLE RESULT_OF_UNAME
OUTPUT_STRIP_TRAILING_WHITESPACE)
configure_file(extra_options.rsp.in
${CMAKE_CURRENT_BINARY_DIR}/extra_options.rsp 
@ONLY)

第 3 步:

将对已配置的响应文件的引用添加到已编译的选项中: (在这种情况下,我的目标称为algo(

set_property(TARGET algo APPEND PROPERTY COMPILE_OPTIONS
"@${CMAKE_CURRENT_BINARY_DIR}/extra_options.rsp")

我的系统上的示例输出:

extra_options.rsp:

-DBUILD_HOST="Darwin codeblaster.local 16.5.0 Darwin Kernel Version 16.5.0: Fri Mar  3 16:52:33 PST 2017; root:xnu-3789.51.2~3/RELEASE_X86_64 x86_64"

VERBOSE=1 make结果 :

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-isystem /Users/rhodges/.hunter/_Base/3973bc2/7c86f54/a5fd140/Install/include -g @/Users/rhodges/algo/cmake-build-debug/extra_options.rsp -std=gnu++14 -o CMakeFiles/algo.dir/main.cpp.o -c /Users/rhodges/algo/main.cpp