cmake target_sources指令详解

target_sources 指令用于为 CMake 目标添加源文件。这种方法的优点在于它可以将源文件添加到目标中,并且可以在 CMake 的生成阶段自动更新。

语法

cpp 复制代码
target_sources(<target> [INTERFACE|PUBLIC|PRIVATE] <source1> <source2> ...)
  • target: 要添加源文件的目标,通常是通过 add_executable 或 add_library 定义的目标。
  • INTERFACE: 指定这些源文件对其他目标是可见的,但不会包含在目标本身的构建中。这通常用于接口库。
  • PUBLIC: 指定这些源文件对其他链接到该目标的目标是可见的,同时也包含在目标本身的构建中。
  • PRIVATE: 指定这些源文件仅对目标本身可见,不会传播到链接到该目标的其他目标。

示例

  1. 为库添加源文件:
cpp 复制代码
add_library(my_library STATIC lib1.cpp lib2.cpp)

# 添加更多源文件到 my_library
target_sources(my_library PRIVATE lib3.cpp lib4.cpp)

在这个例子中,lib3.cpp 和 lib4.cpp 被添加到 my_library 目标中,而 lib1.cpp 和 lib2.cpp 是在 add_library 中最初定义的。

  1. 使用生成的源文件:
cpp 复制代码
add_library(my_library STATIC lib1.cpp)

# 假设生成了额外的源文件,例如通过某些预处理操作
file(GLOB GENERATED_SOURCES "generated/*.cpp")

# 将生成的源文件添加到目标
target_sources(my_library PRIVATE ${GENERATED_SOURCES})

这个例子中,GENERATED_SOURCES 是通过 file(GLOB ...) 生成的一组源文件,它们被添加到 my_library 目标中。

  1. 为接口库添加源文件:
cpp 复制代码
add_library(my_interface_library INTERFACE)

# 添加源文件到接口库
target_sources(my_interface_library INTERFACE interface_file.cpp)

接口库通常不直接编译源文件,但你可以使用 target_sources 为它定义源文件,以便使用该库的其他目标能够访问这些源文件。

使用场景

  • 动态更新源文件列表: 使用 target_sources 可以动态地管理源文件列表,这在自动生成文件时特别有用。
  • 清晰的目标组织: 通过 target_sources 可以更清晰地组织目标的源文件,而不必在 add_library 或 add_executable 中定义所有源文件。
  • 跨目标源文件共享: 可以将公共源文件添加到多个目标中,使源文件的管理更加集中。

通过 target_sources,你可以更灵活地管理目标的源文件,并在 CMake 配置过程中更好地控制构建逻辑。

相关推荐
charlie11451419116 分钟前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(OLED设备层封装)
c语言·stm32·单片机·教程·oled·嵌入式软件
张太行_17 分钟前
C++中的析构器(Destructor)(也称为析构函数)
开发语言·c++
小林up1 小时前
【C语言设计模式学习笔记1】面向接口编程/简单工厂模式/多态
c语言·设计模式
涛ing5 小时前
32. C 语言 安全函数( _s 尾缀)
linux·c语言·c++·vscode·算法·安全·vim
独正己身5 小时前
代码随想录day4
数据结构·c++·算法
厂太_STAB_丝针7 小时前
【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
c语言·单片机·嵌入式硬件
我不是代码教父8 小时前
[原创](Modern C++)现代C++的关键性概念: 流格式化
c++·字符串格式化·流格式化·cout格式化
利刃大大8 小时前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
charlie1145141918 小时前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
c语言·驱动开发·单片机·学习·教程·oled
子燕若水8 小时前
mac 手工安装OpenSSL 3.4.0
c++