C++ CMake正在删除预处理器定义 cmake—构建_构建输出

C++ CMake正在删除预处理器定义 cmake—构建_构建输出,c++,c,cmake,C++,C,Cmake,警告:不能传递包含“#”的预处理器定义 编译器命令行,因为许多编译器不支持它。 CMake正在删除预处理器定义:BUILD\u HOST=“Linux cvuppala bri vm 2.6.32-573.7.1.el6.x86_64#1 SMP周二9月22日22:00:00 UTC 2015 x8664 64 x8664 64 x8664 64 GNU/Linux“考虑定义宏 在(配置的)头文件中 接待 对应的代码cmake代码段 执行程序( 联阿援助团指挥部 工作目录${CMAKE\u SO

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

接待 对应的代码cmake代码段

执行程序( 联阿援助团指挥部 工作目录${CMAKE\u SOURCE\u DIR} 输出变量生成主机 输出\u条带\u尾随\u空格 ) 添加_定义(-DBUILD_HOST=“${BUILD_HOST}”)
问题是命令
uname-a
的输出包含“#”。即使字符串被引用,我想知道为什么cmake禁止它

但是,要解决此问题,在添加定义之前,应将“#”从
BUILD\u HOST
中删除或替换为另一个字符

string(REGEX REPLACE "\#"
       "" BUILD_HOST
       ${BUILD_HOST})
这将
BUILD\u主机
字符串中删除
“#”

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

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})

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

但是,要解决此问题,在添加定义之前,应将“#”从
BUILD\u HOST
中删除或替换为另一个字符

string(REGEX REPLACE "\#"
       "" BUILD_HOST
       ${BUILD_HOST})
这将
BUILD\u主机
字符串中删除
“#”

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

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

我的系统上的输出示例:

额外选项.rsp:
VERBOSE=1 make的结果

/Applications/Xcode.app/Contents/Developer/toolschains/xcodefault.xctoolschain/usr/bin/c++
-智能系统 /Users/rhodges/.hunter/_Base/3973bc2/7c86f54/a5fd140/Install/include -g @/用户/rhodges/algo/cmake build debug/extra_options.rsp -标准=gnu++14 -o cmakfiles/algo.dir/main.cpp.o
-c/Users/rhodges/algo/main.cpp

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

步骤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

我的系统上的输出示例:

额外选项.rsp:
VERBOSE=1 make的结果

/Applications/Xcode.app/Contents/Developer/toolschains/xcodefault.xctoolschain/usr/bin/c++
-智能系统 /Users/rhodges/.hunter/_Base/3973bc2/7c86f54/a5fd140/Install/include -g @/用户/rhodges/algo/cmake build debug/extra_options.rsp -标准=gnu++14 -o cmakfiles/algo.dir/main.cpp.o
-c/Users/rhodges/algo/main.cpp

谢谢你的回复,有没有其他方法可以通过uname-结果就是这样?谢谢你的回复,有没有其他方法可以通过uname-结果就是这样?如果可能的话,最好按照cmake的建议去做。使用configure_file()配置config.hpp头文件,并将其包含在项目的公共头文件中。另一种方法是使用configure_file为编译器生成响应文件,并在目标的“编译器选项”属性中指定响应文件。@RichardHodges是的,如果从头开始,效果更好,但是我们现在正在从make升级到cmake,我无法更改源文件。你的意思是你正在降级…@RichardHodges我没有理解你的意思?如果可能的话,一个好主意是按照cmake的建议去做。使用configure_file()配置config.hpp头文件,并将其包含在项目的公共头文件中。另一种方法是使用configure_file为编译器生成响应文件,并在目标的“编译器选项”属性中指定响应文件。@RichardHodges是的,如果从头开始,效果更好,但是我们现在正在从make升级到cmake,我无法更改源文件。你的意思是你正在降级…@richardhoges,我没有理解你的意思?