通过cmake定义预处理器宏

时间:2012-01-26 11:35:58

标签: c++ cmake c-preprocessor

如何通过cmake定义预处理器变量?

等效代码为#define foo

4 个答案:

答案 0 :(得分:339)

很长一段时间,CMake为此目的拥有add_definitions命令。但是,最近该命令已被更精细的方法取代(编译定义,包含目录和编译器选项的单独命令)。

使用新add_compile_definitions的示例:

    add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
    add_compile_definitions(WITH_OPENCV2)

或者:

    add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)

关于这一点的好处在于它绕过了CMake为add_definitions设置的破旧诡计。 CMake是一个如此破旧的系统,但他们终于找到了一些理智。

在此处查找有关用于编译器标志的命令的更多说明:https://cmake.org/cmake/help/latest/command/add_definitions.html

同样,你可以按照Jim Hunziker的回答中的说明为每个目标做到这一点。

答案 1 :(得分:204)

要为特定目标执行此操作,您可以执行以下操作:

target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)

如果您正在构建多个目标并且不希望它们都使用相同的标记,则应该执行此操作。另请参阅target_compile_definitions上的官方文档。

答案 2 :(得分:9)

  

此页面上提出的其他解决方案仅对OLD版本的Cmake有用。这里是新版本的解决方案。使用$ cmake --version检查Cmake的版本,然后选择适合您需求的解决方案。 cmake documentation可以在官方页面上找到。

对于CMake版本3.3.2,为了创建

#define foo

我需要使用:

add_definitions(-Dfoo)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

,并且为了具有这样的预处理器宏定义:

#define foo=5

该行是这样修改的:

add_definitions(-Dfoo=5)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

答案 3 :(得分:0)

当您的解决方案包含许多项目时,我建议使用 target_*** 操作而不是 add_*** 操作。