Answers:
长期以来,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的答案中的说明按目标执行此操作。
add_compile_definitions
抛出CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
。不得不使用add_compile_options(-D <your-def>)
代替。
cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'
(未测试)
https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions
并开始向下更改版本号,直到页面消失。那将是尚不存在的版本。在下一步中,您可以转至该Whats new
部分以查找新命令或功能。所以它并不难。
要针对特定目标执行此操作,可以执行以下操作:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
如果要构建的目标不止一个,并且不希望它们全部使用相同的标志,则应执行此操作。另请参阅有关target_compile_definitions的官方文档。
target_compile_definitions(my_target PRIVATE FOO=1)
与set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
有何不同?
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的标志。
本页上提出的其他解决方案对于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(....)
add_definitions()
或target_compile_definitions()
。add_compile_definitions()
直到CMake 3.12才添加了更现代的命令。@ Leos313