cmake target_compile_definitions指令详解

target_compile_definitions 指令用于为指定的目标设置预处理器定义(即编译时的宏定义)。这些定义会在编译时传递给编译器,影响编译器如何处理代码。

语法

target_compile_definitions(<target> [INTERFACE|PUBLIC|PRIVATE] <definition>...)
  • target: 要应用这些定义的目标,通常是通过 add_executable 或 add_library 定义的目标。
  • INTERFACE: 定义将仅应用于使用此目标的其他目标,不会应用于该目标本身。通常用于库的公共 API。
  • PUBLIC: 定义将应用于该目标及所有链接到该目标的目标。适用于库的公共部分和使用该库的可执行文件或其他库。
  • PRIVATE: 定义将仅应用于该目标,不会传播给其他依赖于该目标的目标。

示例

  1. 简单定义:
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 参数。

  1. 传递性定义:
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 的。

  1. 接口定义:
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,你可以精细控制每个目标的编译环境,确保在不同环境下正确编译和运行代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值