警告:预处理器定义包含'#'可能不会被传递 编译器命令行,因为许多编译器不支持它。 CMake正在删除预处理器定义: BUILD_HOST =" Linux cvuppala-bri-vm 2.6.32-573.7.1.el6.x86_64#1 SMP Tue Sep 22 22:00:00 UTC 2015 x86_64 x86_64 x86_64 GNU / Linux"考虑定义宏 在(已配置的)头文件中。
相应的代码cmake代码段
execute_process( COMMAND uname -a WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE BUILD_HOST OUTPUT_STRIP_TRAILING_WHITESPACE ) add_definitions(-DBUILD_HOST="${BUILD_HOST}")
答案 0 :(得分:3)
问题是命令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 :(得分:0)
答案是使用响应文件为编译器设置额外的命令行选项:
创建响应文件模板,在本例中称为extra_options.rsp.in
-DBUILD_HOST="@RESULT_OF_UNAME@"
在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)
将已配置的响应文件的引用添加到已编译的选项:
(在这种情况下,我的目标称为algo
)
set_property(TARGET algo APPEND PROPERTY COMPILE_OPTIONS
"@${CMAKE_CURRENT_BINARY_DIR}/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