讲师中心 微信公众号
AI工具推荐 视频效率加速

CMake PUBLIC PRIVATE INTERFACE是什么意思?

千晨君_9245

千晨君_9245

发布时间:2026-08-05 19:15:08

|

511人浏览过

|

来源于php中文网

原创

CMake中PUBLIC、PRIVATE、INTERFACE决定依赖是否向下游传播:PRIVATE仅当前目标使用且不传播,PUBLIC使当前目标及所有下游目标继承依赖,INTERFACE要求下游目标必须链接而当前目标不链接。

cmake public private interface是什么意思? - php中文网

要让CMake正确传递头文件路径、编译定义和链接库,必须搞清PUBLIC、PRIVATE、INTERFACE在target_link_libraries等命令中的实际行为——它们不是语义标签,而是决定依赖是否向下游传播的开关。

先看一个典型错误场景

你写了一个静态库libmath,它的头文件math.h里直接用了<cmath>,而源文件math.cpp还额外链接了系统数学库m。如果用target_link_libraries(libmath PRIVATE m),下游可执行程序链接libmath时会编译失败:找不到sqrt等符号。

因为PRIVATE只告诉CMake“libmath自己要连m”,但不告诉编译器“调用libmath的代码也需要看到m提供的符号声明”。这一步错,整个依赖链就断在编译期。

三种作用域的本质区别

PUBLIC、PRIVATE、INTERFACE不是并列选项,而是从“谁用”和“谁传”两个维度交叉定义的:

PRIVATE:当前目标需要,且不向任何下游目标暴露。适用于仅在.cpp中调用、头文件完全不涉及的依赖。比如日志库spdlog只在libnetwork的实现里打日志,头文件里没它,就用PRIVATE。

PUBLIC:当前目标需要,且所有链接它的目标也自动继承该依赖。适用条件是:头文件中直接或间接包含了被依赖库的头文件。例如libjson的json.hpp里#include <nlohmann/json.hpp>,就必须PUBLIC链接nlohmann_json。

INTERFACE:当前目标自己不链接,但所有链接它的目标必须链接。典型用于纯头文件库(header-only)——它没有.o文件,但别人用它时必须有对应依赖。比如Eigen库本身不编译,但你的libvision用了Eigen头文件,就得INTERFACE链接Eigen。

不同命令中作用域的实际效果

方法一:target_link_libraries

这是最常踩坑的地方。对可执行文件使用PUBLIC/INTERFACE等同于PRIVATE,因为可执行文件没有“下游”;但对库目标,三者行为截然不同:

• PRIVATE m → libA连m,libB链接libA时看不到m,运行时若libA内部调用m函数,libB加载后可能报undefined symbol

• PUBLIC m → libA连m,libB链接libA时自动获得m的链接项和头文件路径(如果m通过target_include_directories设了PUBLIC)

• INTERFACE m → libA不连m,但libB链接libA时强制连m;libA自己编译会失败(除非m确实是纯头文件)

CMake 4.3.2
CMake 4.3.2

CMake 4.3.2 Windows x86_64 历史版本安装包,适合旧项目兼容、构建环境回退、CMakeLists.txt 迁移验证、Visual Studio/Ninja/Makefile 生成器测试和 C/C++ 项目维护。

下载

【INTERFACE链接的库必须确保调用方能独立完成链接,否则构建直接中断】

方法二:target_include_directories

作用域决定头文件搜索路径如何传播:

PRIVATE include → 只有libA的源文件能#include "a.h",libB链接libA后不能访问libA头文件里的#include "a.h"

PUBLIC include → libA自己能用,libB链接libA后也能顺着include路径找到a.h

INTERFACE include → libA自己不用这些头文件,但libB链接libA后,编译器会把include加进libB的-I参数里

方法三:target_compile_definitions

宏定义的可见性直接影响条件编译逻辑:

PRIVATE ENABLE_LOG → 只有libA的.cpp里#ifdef ENABLE_LOG会生效

PUBLIC ENABLE_LOG → libA和所有链接libA的目标都能看到这个宏

INTERFACE ENABLE_LOG → libA不感知该宏,但libB链接libA后,其编译单元自动定义ENABLE_LOG

相关文章

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
go中interface用法
go中interface用法

本专题整合了go语言中int相关内容,阅读专题下面的文章了解更多详细内容。

3050

2025.09.10

C++ 跨平台开发
C++ 跨平台开发

本专题聚焦 C++ 在跨平台应用与工程构建中的实战应用,系统讲解 CMake 构建系统、跨平台编译配置、第三方库集成、调试技巧、静态与动态链接库管理等核心知识。通过实战案例(如跨平台工具开发、Linux与Windows编译兼容性项目),帮助学习者掌握 从环境配置到完整跨平台构建的开发能力。

5206

2025.10.17

c++  cmake用法
c++ cmake用法

本专题整合了c++ cmake用法相关教程,阅读专题下面的文章了解更多详细内容。

1371

2025.10.23

C++ 编译构建系统与CMake实战
C++ 编译构建系统与CMake实战

本专题聚焦 C++ 项目的编译与构建体系,系统讲解 CMake 的核心语法、项目结构设计、库与依赖管理、跨平台构建、调试与发布配置。通过完整项目示例,帮助开发者掌握 从源码到可执行程序的工程化构建流程,提升 C++ 项目在实际开发中的可维护性与扩展性。

314

2025.12.13

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

160

2026.09.16

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

60

2026.09.16

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

60

2026.09.16

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

40

2026.09.16

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

40

2026.09.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CMake 构建系统手册
CMake 构建系统手册

共0课时 | 0人学习

CLion CMake 快速入门教程
CLion CMake 快速入门教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn