news 2026/6/15 21:17:51

CMake: target_link_libraries() 函数可见性说明符PUBLIC,PRIVATE,INTERFACE

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CMake: target_link_libraries() 函数可见性说明符PUBLIC,PRIVATE,INTERFACE

文章目录

      • 1. 含义说明
      • 2. 示例
        • dep/CMakeLists.txt
        • mylib/CMakeLists.txt(关键部分)

在 CMake 中,target_link_libraries()函数用于指定目标(如可执行文件或库)的链接依赖。其中可以使用PUBLICPRIVATEINTERFACE三种可见性说明符(visibility specifiers),它们主要在构建库(library)目标时影响依赖的传递行为。下面分别说明其含义,并辅以示例。


1. 含义说明

假设你有一个库MyLib,它依赖于另一个库DepLib,而你的可执行程序MyApp又链接了MyLib。此时:

  • PRIVATE DepLib
    表示DepLib仅在MyLib内部使用,调用者(如MyApp不需要知道也不应依赖DepLibDepLib不会传递给链接MyLib的目标。

  • PUBLIC DepLib
    表示DepLib既是MyLib的依赖,也是其接口的一部分。调用者(如MyApp)在链接MyLib会自动继承对DepLib的依赖(包括头文件路径、编译定义等,如果DepLib是通过target_include_directories等设置的)。

  • INTERFACE DepLib
    表示DepLib不是MyLib自己需要的,而是提供给使用者的MyLib本身不链接DepLib,但任何链接MyLib的目标都会继承这个依赖。通常用于头文件库(header-only library)

注意:这些说明符只对库目标(STATIC/SHARED/OBJECT/INTERFACE)有意义。对于可执行文件(executable),PUBLICINTERFACE行为类似于PRIVATE(因为可执行文件没有“使用者”)。


2. 示例

假设有如下项目结构:

project/ ├── CMakeLists.txt ├── mylib/ │ ├── CMakeLists.txt │ ├── include/mylib.h │ └── src/mylib.cpp ├── dep/ │ ├── CMakeLists.txt │ ├── include/dep.h │ └── src/dep.cpp └── app/ ├── CMakeList.txt └── main.cpp
dep/CMakeLists.txt
add_library(dep src/dep.cpp) target_include_directories(dep PUBLIC include)
mylib/CMakeLists.txt(关键部分)
add_library(mylib src/mylib.cpp) target_include_directories(mylib PUBLIC include) # 情况1:PRIVATE target_link_libraries(mylib PRIVATE dep) # 情况2:PUBLIC # target_link_libraries(mylib PUBLIC dep) # 情况3:INTERFACE(此时 mylib 可能是 header-only) # add_library(mylib INTERFACE) # target_link_libraries(mylib INTERFACE dep)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 13:42:43

LVS:Linux Virtual Server

LVS:Linux Virtual Server 一、负载均衡 1.1 实现方式 硬件: F5 软件:LVS:Linux Virtual Server,阿里云四层SLB(Server Load Balance)nginx:支持七层调度,阿里云七层SLB使用Tengine(…

作者头像 李华
网站建设 2026/6/15 13:56:18

JSAPIThree 加载 3D Tiles 学习笔记:大规模三维场景渲染

在实际项目中,我们经常需要加载大规模的三维场景数据,比如城市建筑模型、地形数据等。3D Tiles 是 Cesium 提出的开放标准,用于高效地流式传输和渲染大量 3D 内容。今天就来学习一下如何在 mapvthree 中使用 3D Tiles。了解 3D Tiles 3D Tile…

作者头像 李华
网站建设 2026/6/15 11:45:39

LobeChat能否实现思维发散引导?头脑风暴AI教练

LobeChat能否实现思维发散引导?头脑风暴AI教练 在创意枯竭的深夜,面对空白文档反复删改标题的产品经理;在课堂上试图激发学生想象力却陷入“标准答案”惯性的教师;在心理咨询室中努力帮助来访者打开表达通道的心理工作者——他们共…

作者头像 李华
网站建设 2026/6/15 5:59:00

人工智能之数字生命---绘画能力的生成3

下面这份清单按约束来:世界树中“存在”只有一层;更细的“子存在/局部世界”放到附属世界树里;因此这里只列需要“复合规则”才能生成/比较/还原的特征类型(= 不是单一标量就能表达/比较的那种)。 说明:像 位置X/Y/Z、尺寸_左右/上下/前后 这类原子标量特征不在此列。 1)…

作者头像 李华
网站建设 2026/6/15 11:49:11

现在数字生命已经能“看清物体的内部结构”了!

设计目标 输入:一个主存在的高分辨率裁剪图像 精确掩膜(来自点簇增强结果)输出:多个子存在观测(如杯子的把手、瓶盖、人的手臂等)递归:每个子存在可继续提取更细孙存在(支持任意深度…

作者头像 李华
网站建设 2026/6/15 11:47:31

为什么网盘不能彻底取代硬盘呢?

存储备份和只读、文档编辑等场景,网盘和NAS可以代替硬盘功能,但网盘需要依赖网络,比如安装操作系统、剪辑高清电影、游戏场景等对数据传输有要求的场景更适合硬盘。网盘和本地硬盘的核心差异在于数据控制权、访问稳定性和传输效率&#xff0c…

作者头像 李华