在C ++中使用CMAKE中的变量

时间:2014-06-30 10:39:50

标签: c++ cmake

我想在我的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;
}

有可能吗?

谢谢!

4 个答案:

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