CMake 正在删除预处理器定义
CMake is dropping a preprocessor definition
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
- VS2015 预处理器定义与点
- 替换预处理器定义中的字符
- CMake 正在删除预处理器定义
- CMAKE CHECKCSOURCECOPILE将预处理器定义传递给Armlink
- 是否可以使用字符串检查预处理器定义
- 如何使用算术生成预处理器定义?
- 如何在库加载时将预处理器定义传递给 DLL
- 将多个Pragma指令放入一个预处理器定义中
- 如何在Yocto构建的CMAKE项目中添加预处理器定义
- XCode预编译标头中的C 语言的预处理器定义了什么?
- 全局重新定义多个冲突的预处理器定义
- 使用预处理器定义多个相似的变量C++
- 使用预处理器C++定义常见错误消息
- 预处理器定义/添加新配置文件
- 预处理器定义重复
- 我需要重新定义父项目中的预处理器定义吗
- 这个无括号的C预处理器定义是否安全
- 使用 VS 宏设置预处理器定义
- Objective-C 预处理器定义,动态 C 字符串到 NSString 声明
- 如何为 cout 创建预处理器定义,该定义用预定义常量包围字符串