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

CMake安装后怎么添加源文件?

冬伟大大_7937

冬伟大大_7937

发布时间:2026-08-09 20:37:36

|

241人浏览过

|

来源于php中文网

原创

add_executable()直接列源文件仅适用于单文件或极小项目;现代CMake推荐用target_sources()解耦目标定义与源文件管理,并配合CONFIGURE_DEPENDS和source_group()提升可维护性。

cmake安装后怎么添加源文件?

add_executable() 里直接列源文件最简单,但只适合单文件或极小项目

刚上手时最容易想到的就是在 add_executable() 里一股脑写全所有 .cpp 文件,比如:add_executable(myapp main.cpp utils.cpp network.cpp)。这确实能跑通,但一旦源文件超过 5 个,每次增删都要手动改这行,很快就会漏掉、拼错路径、或者把头文件误加进去导致编译失败。

更麻烦的是,这种写法无法区分哪些是实现文件(.cpp),哪些是头文件(.h),而 IDE(比如 VS)依赖正确分类才能显示在“Header Files”和“Source Files”分组下——你手动加的 .h 文件会被当成编译单元,可能触发重复定义错误。

  • 只推荐用于原型验证或单文件练习
  • 绝对不要在团队项目或持续迭代的代码中长期使用
  • 如果硬要用,确保列表里只有 .cpp、.c 等可编译后缀,别混入 .h

target_sources() 是现代 CMake 添加源文件的标准方式

target_sources() 的核心价值不是“多写一行”,而是把“目标定义”和“源文件归属”解耦。它允许你在 add_executable() 之后,按需、分批、带作用域地添加文件,尤其适合子目录管理、条件编译、或生成源文件(如 protobuf 编译产出的 pb.cc)。

关键点在于作用域参数:PRIVATE 最常用,表示这些源只参与当前目标编译;PUBLIC 会把头文件暴露给依赖者(慎用,一般用 target_include_directories() 更清晰);INTERFACE 基本不用在 .cpp 上。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 基础写法:add_executable(myapp) 后接 target_sources(myapp PRIVATE main.cpp utils.cpp)
  • 头文件建议也加进来(仅为了 IDE 分组):target_sources(myapp PUBLIC main.cpp utils.cpp utils.h)
  • 跨子目录时路径必须写全:target_sources(myapp PRIVATE src/main.cpp libs/net/conn.cpp)

file(GLOB_RECURSE) 自动收集文件,但 CONFIGURE_DEPENDS 不可省略

想让 CMake 像 VS 那样“自动感知新增文件”,就得用 file(GLOB_RECURSE)。但它默认是静态快照——第一次 configure 后新增的 .cpp 文件,不重新运行 cmake 就不会被加入构建。这就是为什么 CONFIGURE_DEPENDS 必须显式启用:

file(GLOB_RECURSE sources CONFIGURE_DEPENDS "src/*.cpp" "src/*.h")
target_sources(myapp PRIVATE ${sources})

  • 不加 CONFIGURE_DEPENDS:新增文件后必须手动删 build 目录再 cmake,否则无效
  • GLOB_RECURSE 会钻进 build/ 目录找文件,如果 build 目录里有临时生成的 .cpp(比如 moc 或 protobuf 输出),会被误加——务必把 build 目录排除在外,或改用 file(GLOB) 限定一级目录
  • Android NDK 等受限环境可能不支持 CONFIGURE_DEPENDS,此时只能退回到手动维护变量

source_group() 让 VS 或 CLion 显示文件夹结构

即使源文件物理路径是 src/network/client.cpp 和 src/utils/log.h,默认生成的 VS 解决方案里它们仍平铺在根目录。要还原文件夹视图,必须配合 source_group():

source_group("Source Files\Network" FILES src/network/client.cpp)
source_group("Header Files\Utils" FILES src/utils/log.h)

  • 路径分隔符用双反斜杠 \(Windows)或正斜杠 /(跨平台),不能混用
  • 分组名是纯显示用字符串,和磁盘路径无关;同一分组可跨多个物理路径
  • 这个命令必须在 add_executable() 或 add_library() 之后、target_sources() 之前调用才生效
CMake 添加源文件真正难的不是语法,而是路径语义和作用域控制——一个 .h 文件该用 PUBLIC 还是 INTERFACE,CONFIGURE_DEPENDS 在 CI 环境是否可靠,source_group() 的层级怎么和团队约定对齐,这些细节不踩几次坑很难记住。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

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

WorkBuddy

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

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

咔片AIPPT

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

豆包大模型

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

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
C++ 跨平台开发
C++ 跨平台开发

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

7006

2025.10.17

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

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

1651

2025.10.23

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

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

374

2025.12.13

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

40

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

60

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

20

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
LLVM CMake构建指南
LLVM CMake构建指南

共0课时 | 0人学习

LLVM入门手册
LLVM入门手册

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

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

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