当前位置: 首页 > news >正文

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)
http://www.cnnetsun.cn/news/93236.html

相关文章:

  • 计算机体系结构中的中断处理机制:硬件响应与软件识别的协同架构
  • Wallpaper Engine下载器:3步轻松获取海量创意工坊壁纸!
  • 延迟优化实战:LobeChat端到端响应时间缩短30%
  • 工业监控系统构建指南:FUXA开源SCADA平台的快速上手与实战应用
  • 原来是“图”!
  • 力扣(LeetCode) 35: 搜索插入位置 - 解法思路
  • 读书笔记整理:LobeChat提炼书中精华
  • 黑天鹅养殖技术性价比高的公司
  • 终极B站视频下载指南:专业级超高清内容获取方案
  • 我发现糖尿病预测跑出-15%后来才知道漏处理缺失值补多重插补才稳住
  • 跨境电商物流选择指南:从痛点分析到智能决策
  • 百度网盘解析工具:3分钟告别下载限速烦恼
  • FreeMove终极指南:Windows文件迁移的革命性解决方案
  • FeHelper全能工具箱:前端开发效率提升终极指南
  • QQ空间历史说说完整备份指南:永久珍藏你的数字记忆
  • 十大MCP Server方案,让DevOps步入智能新时代
  • VUE3:深入浅出探究pinia、provide\inject在多层组件页面是怎么使用的
  • Molecular Operating Environment (MOE) 完整安装与配置指南
  • LobeChat能否用于生成直播话术?电商主播提词器
  • 终极C++网络编程:构建高性能HTTP服务的完整指南
  • 显卡驱动终极清理指南:一键彻底解决兼容性问题
  • Zotero GPT:用AI重新定义文献管理效率
  • LobeChat与LangChain结合应用:打造复杂AI工作流
  • 突破60帧束缚:原神性能优化工具深度解析
  • 云计算作业—-V L AN实验
  • 当连锁巡检“听懂人话”:VLM技术下的智能运营新场景
  • 责任链模式(Chain of Responsibility):实现事件或请求的逐级处理与传递
  • SMUDebugTool深度探索:解锁AMD Ryzen系统的隐藏性能
  • JavaScript 中的单例模式:利用闭包、IIFE 或 ES Modules 实现线程安全的单例
  • CORS 机制中的预检请求(Preflight Request):为什么 OPTIONS 请求总是先于复杂请求发送?