C++ 将CMake变量传递给C++;源代码

C++ 将CMake变量传递给C++;源代码,c++,cmake,C++,Cmake,首先,我已经读过了,我真的不知道它是否能帮助我 第二,我的问题。顶级CMakeLists.txt表示SET(MY_VAR/some/path),而在顶级source.cpp中,我需要以某种方式实现一个std::string,其中包含/some/path/to/files,自然地使用MY_VAR值。编译期间传递值的唯一方法是传递宏。例如,如果CMake设置了一个名为$(MY_VAR)(与make(1)一样)的宏: 并且,xxx.cc根据需要使用MY\u VAR。您可以使用配置文件(文件名输出文件)

首先,我已经读过了,我真的不知道它是否能帮助我


第二,我的问题。顶级CMakeLists.txt表示
SET(MY_VAR/some/path)
,而在顶级source.cpp中,我需要以某种方式实现一个
std::string
,其中包含
/some/path/to/files
,自然地使用
MY_VAR
值。

编译期间传递值的唯一方法是传递宏。例如,如果CMake设置了一个名为
$(MY_VAR)
(与
make(1)
一样)的宏:


并且,
xxx.cc
根据需要使用
MY\u VAR

您可以使用
配置文件(文件名输出文件)
命令。它用cmake VARIABLE
VARIABLE
的实际值替换文件
filename
中的
${VARIABLE}
@VARIABLE@
之类的内容,并将结果写入
输出文件

所以,你可以写这样的东西

// in C++ code
std::string my_var = "@MY_VAR@";

# in CMakeLists.txt
configure_file(filename.h.in filename.h)
此外,我认为在构建目录(及其“包含目录”添加到包含路径)中的某个地方生成输出文件是一个好主意


对不起,我是CMake的noob。你能告诉我怎么做吗?@Javier,哎呀。固定使用宏(我假设CMake在这里使用
make(1)
语法…)这不是唯一的方法,请看我的答案。@lisyarus,这会损坏要编译的文件。我坚持我的主张。@vonbrand:你说“弄乱要编译的文件”是什么意思?哦,天哪。现在我知道我想远离CMake。谢谢这几乎奏效了。我的意思是,确实如此,但它永远用变量的值替换了变量。如果我更改变量的值会怎么样?在下一次编译中不再有@VARIABLE@可替换。用“永远”表示的是,我打开了source.cpp,没有看到
@VARIABLE@
,但现在看到了
/some/path
。@Javier:如果变量的值发生变化,将在调用cmake时重新生成文件(如果使用cmake生成的makefiles进行构建,则会自动调用该命令)。@Javier:该命令应用于从某种模板文件生成真实的源文件,而不是像
configure\u file(source.cpp source.cpp)那样调用它可能没有阅读技巧USSIT很清楚地说明如何在宏中使用Cmake从C++中传递一个值。这样我就可以在MyAvain中使用.CP.是的。MyOVAR= ${MyAva}是“CPPNAMED=${CMACHYNAMED}”的形式。“。但在我的示例中,两者是相同的。在2.8.9版中无法执行此操作。我无法升级。这仍然是正确的答案:)
// in C++ code
std::string my_var = "@MY_VAR@";

# in CMakeLists.txt
configure_file(filename.h.in filename.h)
add_executable(myexe main.cpp)
if (MY_VAR)
    target_compile_definitions(myexe PRIVATE MY_VAR=${MY_VAR})
endif()