如何通过cmake定义预处理器变量?
等效代码为#define foo
。
答案 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_***
操作。