ypn*_*nos 361
很长一段时间,CMake都有add_definitions这个目的.但是,最近该命令已被更精细的方法取代(编译定义,包含目录和编译器选项的单独命令).
使用新的add_compile_definitions的示例:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)
Run Code Online (Sandbox Code Playgroud)
要么:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)
Run Code Online (Sandbox Code Playgroud)
关于这一点的好处是它绕开了CMake已经到位的破旧诡计add_definitions.CMake是一个如此破旧的系统,但他们终于找到了一些理智.
在此处查找有关用于编译器标志的命令的更多说明:https://cmake.org/cmake/help/latest/command/add_definitions.html
同样,你可以按照Jim Hunziker的回答中所解释的那样按目标执行此操作.
Jim*_*ker 228
要为特定目标执行此操作,您可以执行以下操作:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
Run Code Online (Sandbox Code Playgroud)
如果您正在构建多个目标并且不希望它们都使用相同的标志,则应该执行此操作.
小智 19
如果您使用 CMake 3.X,添加预处理器宏的首选应该是target_compile_definitions。
与任何其他方法相比,您应该更喜欢这种方法的原因是因为它是target基于粒度的。IE 宏只会添加到您的 exe/库中。
这是一个常见的例子:
if (WIN32)
target_compile_definitions(my_lib PRIVATE
# Prevents Windows.h from adding unnecessary includes
WIN32_LEAN_AND_MEAN
# Prevents Windows.h from defining min/max as macros
NOMINMAX
)
endif()
Run Code Online (Sandbox Code Playgroud)
3.12 版本中的新功能。
在此处查找有关用于编译器标志的命令的更多说明: https: //cmake.org/cmake/help/latest/command/add_definitions.html
add_compile_definitions将宏应用于调用后定义的任何目标。
这里的逻辑与上面的 add_compile_definitions 相同。
add_compile_definitions(WIN32_LEAN_AND_MEAN NOMINMAX)
add_library(my_lib)
Run Code Online (Sandbox Code Playgroud)
如果您使用此方法,并且您是顶级项目,请务必小心。否则,如果用户使用add_subdirectory使用您的库,他们可能会遇到问题。
这些方法确实不再推荐了。由于不模块化、扩展性不好、不支持生成器表达式等。
全局应用预处理器标志(或任何编译器标志)可以在构建中创建隐藏的依赖项。
本质上将 add_compile_definitions 视为 C/C++ 中的全局变量。有时您需要它们,但要小心。
Leo*_*313 13
此页面上提出的其他解决方案仅适用于Cmake的旧版本.这是新版本的解决方案.使用
$ cmake --version并选择符合您需求的解决方案,检查您的Cmake版本.该cmake的文档可在官方网页上找到.
使用CMake版本3.3.2,以便创建
#define foo
Run Code Online (Sandbox Code Playgroud)
我需要使用:
add_definitions(-Dfoo) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
Run Code Online (Sandbox Code Playgroud)
并且,为了具有像这样的另一个预处理器宏定义:
#define foo=5
Run Code Online (Sandbox Code Playgroud)
这条线是如此修改:
add_definitions(-Dfoo=5) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
Run Code Online (Sandbox Code Playgroud)