通过CMake定义预处理器宏?


Answers:


383

长期以来,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的答案中的说明按目标执行此操作。


4
在链接的页面上:“注意此命令已被替代:使用add_compile_definitions()添加预处理器定义。” 也许这个答案需要编辑?
M.Herzkamp '18年

9
在cmake 3.10.2中,add_compile_definitions抛出CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".。不得不使用add_compile_options(-D <your-def>)代替。
code_dredd

2
@mannyglover我不这么认为,但是您可以使用-D来设置编译器标志,类似于cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'(未测试)
ypnos

1
这真的是新的……实际上是在更现代的CMake(> 3.11)中。很难理解何时引入命令。
桑德堡

1
@Sandburg您可以打开指向上一个文档的链接:https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions并开始向下更改版本号,直到页面消失。那将是尚不存在的版本。在下一步中,您可以转至该Whats new部分以查找新命令或功能。所以它并不难。
安德里

244

要针对特定​​目标执行此操作,可以执行以下操作:

target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)

如果要构建的目标不止一个,并且不希望它们全部使用相同的标志,则应执行此操作。另请参阅有关target_compile_definitions的官方文档。


1
@JimHunziker target_compile_definitions(my_target PRIVATE FOO=1)set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)有何不同?
John Strood

1
@JohnStrood区别在于作用域级别。target_compile_definitions设置整个可执行文件/库的值,其中'set_source_files_properties'仅设置指定文件的值。Latter命令允许使用其他语言编译文件;即:set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c。请注意,-x objective-c这是特定于GCC / Clang的标志。
朱利安·基尔希

20

本页上提出的其他解决方案对于Cmake <的某些版本3.3.2很有用。这是我正在使用的版本(即3.3.2)的解决方案。通过使用检查Cmake的版本,$ cmake --version然后选择适合您需要的解决方案。该cmake的文档可在官方网页上找到。

使用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
根据文档,此解决方案实际上是较旧的,过时的方法。其他答案提供了更现代的解决方案。
squareskittles

2
当我写下答案时,我确实尝试了其他解决方案,但没有一个起作用。
Leos313

@squareskittles,知道为什么其他答案的解决方案无法正常工作吗?如果我尝试的话,CMake会给出错误
Leos313 '19

1
如果您使用的是CMake 3.3.2(如答案中所示),则必须使用add_definitions()target_compile_definitions()add_compile_definitions()直到CMake 3.12才添加了更现代的命令。@ Leos313
squareskittles

1
@squareskittles,我正在更新答案,重新编写我之前在mounths上写的内容。感谢您指出这一点
Leos313,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.