如何为单一语言的所有目标添加编译定义?
为单一语言的所有CMake目标添加编译定义
CMake提供了几种无需逐个目标设置的方式,给特定语言的所有目标统一添加编译定义:
1. 使用语言专属的全局编译定义变量
CMake针对每种语言内置了CMAKE_<LANG>_COMPILE_DEFINITIONS变量,比如C语言对应CMAKE_C_COMPILE_DEFINITIONS,C++对应CMAKE_CXX_COMPILE_DEFINITIONS。这个变量会自动应用到所有后续创建的对应语言目标上,且能自动适配不同编译器的语法(比如MSVC用/D,GCC/Clang用-D)。
示例:
# 给所有C语言目标添加两个编译定义 list(APPEND CMAKE_C_COMPILE_DEFINITIONS "DEBUG_MODE" "PLATFORM=LINUX")
2. 结合生成器表达式的编译选项
使用add_compile_options()配合$<COMPILE_LANGUAGE:<LANG>>生成器表达式,可给当前目录及子目录中所有编译指定语言的目标添加定义,还能结合其他条件做更灵活的配置。
示例:
# 给所有C++语言目标添加编译定义 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-DUSE_CXX_FEATURE>) # 针对MSVC的C语言目标添加特定定义 add_compile_options($<$<AND:$<COMPILE_LANGUAGE:C>,$<CXX_COMPILER_ID:MSVC>>:/DWIN32_C_SPECIFIC>)
3. 修改语言专属编译标志
虽然不如前两种规范,但也可直接在CMAKE_<LANG>_FLAGS(或对应配置的CMAKE_<LANG>_FLAGS_<CONFIG>)中添加-D(或/D)参数,实现全局定义。
示例:
# 给所有Debug模式下的C++目标添加定义 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG_LOG")
注意:这些方法若在根CMakeLists.txt中设置则全局生效,若在子目录中设置则仅对当前目录及子目录的目标生效,无需逐个调用target_compile_definitions()。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

