我想在我的C ++代码中使用我的CMakeLists.txt中声明的值。我试过这样做:
ADD_DEFINITIONS( -D_MYVAR=1 )
和
#if -D_MYVAR == 1
#define var "someone"
#else
#define var "nobody"
#endif
int main(){
std::cout << "hello" << var << std::endl;
return 0;
}
但它不起作用,我不明白为什么。也许我没有正确使用ADD_DEFINITIONS ......
理想情况下,我希望这样做:
ADD_DEFINITIONS( -D_MYVAR=\"someone\" )
和
#define var D_MYVAR
int main(){
std::cout << "hello" << var << std::endl;
return 0;
}
有可能吗?
谢谢!
答案 0 :(得分:6)
add_definitions ( -DVARNAME=... )
是使用add_definitions的正确方法。
要检查常数,请使用
#ifdef VARNAME
...
#endif
答案 1 :(得分:3)
他的解决方案适用于我的第一个问题,而且我可以做到这一点:
<强>的CMakeLists.txt:强>
ADD_DEFINITIONS( -D_VAR=\"myValue\" )
<强> main.cpp中:强>
#include <iostream>
#ifdef _VAR
#define TXT _VAR
#else
#define TXT "nobody"
#endif
int main(){
std::cout << "hello " << TXT << " !" << std::endl;
return 0;
}
答案 2 :(得分:0)
实际上有一种更优雅的方法可以做到这一点,不需要通过C / C ++预处理器。 (我讨厌#ifdef
...)
在CMakeLists.txt
:
set( myvar "somebody" )
# Replaces occurrences of @cmake_variable@ with the variable's contents.
# Input is ${CMAKE_SOURCE_DIR}/main.cpp.in,
# output is ${CMAKE_BINARY_DIR}/main.cpp
configure_file( main.cpp.in main.cpp @ONLY )
在main.cpp.in
:
#include <iostream>
int main(){
// myvar below gets replaced
std::cout << "hello @myvar@" << std::endl;
return 0;
}
但请注意,如此配置的文件会保存在${CMAKE_BINARY_DIR}
中,因此在将其列在源文件中时必须为其添加前缀(默认为${CMAKE_SOURCE_DIR}
):
add_library( myproject foo.cpp bar.cpp ${CMAKE_BINARY_DIR}/main.cpp )
答案 3 :(得分:0)
截至 CMake 3.12
add_definitions
已经 superseeded by other alternatives。
对于这个问题,您应该像使用 add_compile_definitions
一样使用 add_definitions
:
add_compile_definitions( MY_VAR )
(请注意,不再需要 -D
)。
然后在您的 *.cpp
文件中:
#ifdef MY_VAR
// do something if var defined
#endif