target_compile_definitions 指令用于为指定的目标设置预处理器定义(即编译时的宏定义)。这些定义会在编译时传递给编译器,影响编译器如何处理代码。
语法
target_compile_definitions(<target> [INTERFACE|PUBLIC|PRIVATE] <definition>...)
- target: 要应用这些定义的目标,通常是通过 add_executable 或 add_library 定义的目标。
- INTERFACE: 定义将仅应用于使用此目标的其他目标,不会应用于该目标本身。通常用于库的公共 API。
- PUBLIC: 定义将应用于该目标及所有链接到该目标的目标。适用于库的公共部分和使用该库的可执行文件或其他库。
- PRIVATE: 定义将仅应用于该目标,不会传播给其他依赖于该目标的目标。
示例
- 简单定义:
add_executable(my_executable main.cpp)
# Add a compile definition for this target
target_compile_definitions(my_executable PRIVATE MY_DEFINE)
在这个例子中,MY_DEFINE 宏将仅在 my_executable 目标中定义,编译 main.cpp 时,编译器会使用 -DMY_DEFINE 参数。
- 传递性定义:
add_library(my_library my_library.cpp)
target_compile_definitions(my_library PUBLIC MY_LIBRARY_DEFINE)
add_executable(my_executable main.cpp)
target_link_libraries(my_executable my_library)
在这个例子中,MY_LIBRARY_DEFINE 宏不仅在 my_library 中可用,还会传递到 my_executable 中,因为定义是 PUBLIC 的。
- 接口定义:
add_library(my_library INTERFACE)
target_compile_definitions(my_library INTERFACE MY_INTERFACE_DEFINE)
add_executable(my_executable main.cpp)
target_link_libraries(my_executable my_library)
这里,my_library 只是一个接口库,它本身不编译代码,但 MY_INTERFACE_DEFINE 宏将会在所有链接到 my_library 的目标中定义,即在 my_executable 中定义。
使用场景
- 条件编译: 根据不同的目标或构建配置启用或禁用代码块。
- 跨平台支持: 为不同的操作系统或编译器设置特定的预处理器定义。
- 库的API配置: 控制库的公共 API 暴露的功能。
通过 target_compile_definitions,你可以精细控制每个目标的编译环境,确保在不同环境下正确编译和运行代码。