You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过add_library命令添加到库的源文件是PUBLIC还是PRIVATE?

关于add_library传入源文件对应的target_sources作用域说明

直接在add_library调用时传入的源文件,作用域完全等价于通过target_sources的PRIVATE选项添加的源文件。

你可以参考三个作用域的核心适用场景判断:

  • PRIVATE:仅用于编译当前目标本身,相关配置不会传递给任何依赖当前目标的其他目标,所有仅参与当前目标编译的实现文件(.c、.cpp、.m等后缀的实现代码)都应该用该作用域
  • PUBLIC:相关配置既作用于当前目标,也会同步传递给所有依赖当前目标的目标,通常仅用于需要对外暴露的头文件、编译选项等配置
  • INTERFACE:相关配置仅传递给依赖当前目标的目标,当前目标本身不使用该配置,一般用于纯接口库的对外配置

add_library传入的源文件默认只会参与当前目标的编译,不会传递给依赖该目标的其他目标,完全符合PRIVATE作用域的行为特征。

迁移示例

如果你原来的写法是:
add_library(your_target STATIC utils.cpp module.cpp main.cpp)

迁移到子目录的CMakeLists.txt用target_sources添加时,直接写成下面的形式即可:

target_sources(your_target
  PRIVATE
    utils.cpp
    module.cpp
    main.cpp
)

注意:不要将普通实现源文件设置为PUBLIC或INTERFACE作用域,否则会导致依赖当前目标的其他目标重复编译这些源文件,仅在你有明确需要将源文件传递给上游编译的特殊需求时才需要这么做。

内容的提问来源于stack exchange,提问作者QuaternionsRock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:36:01