CMake正在放弃预处理器定义

时间:2017-07-25 04:40:34

标签: c++ c cmake

cmake --build _build output

  

警告:预处理器定义包含'#'可能不会被传递   编译器命令行,因为许多编译器不支持它。    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}")

2 个答案:

答案 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)

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

第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