0

0

c++ cmake使用方法 c++如何用cmake管理项目

煙雲

煙雲

发布时间:2026-03-17 21:21:31

|

131人浏览过

|

来源于php中文网

原创

CMake命令行运行需确保项目根目录存在严格命名的CMakeLists.txt;add_executable用于可执行文件,add_library按STATIC/SHARED/INTERFACE指定库类型;find_package找不到Boost需设置CMAKE_PREFIX_PATH或BOOST_ROOT;头文件不触发重编译因未显式列举源文件或未正确声明include路径。

c++ cmake使用方法 c++如何用cmake管理项目

cmake 命令行怎么跑起来,不报 CMakeLists.txt not found

根本问题不是“怎么写 CMake”,而是项目根目录里缺了 CMakeLists.txt —— 它必须存在,且名字大小写严格匹配(Linux 下 cmlists.txtCmakelists.txt 都不行)。
常见错误现象:在子目录里执行 cmake .,或者把 CMakeLists.txt 放进了 src/ 但你在项目根目录外运行命令。
实操建议:
• 进入项目最外层目录(即你打算生成构建文件的地方)
• 确认该目录下有且仅有一个 CMakeLists.txt
• 运行 cmake -S . -B build(推荐),或旧式写法 cmake .(但不建议在源码目录内生成,易污染)
• 若用 -B build,后续所有构建命令(如 cmake --build build)都得指向这个 build 目录

add_executableadd_library 怎么选对目标类型

选错会导致链接失败或符号找不到,比如把主程序写成 add_library(myapp ...),结果 main() 不被入口识别。
使用场景很直接:
• 可执行文件(带 main 函数)→ 用 add_executable
• 封装功能、供其他模块调用 → 用 add_library,并明确指定类型:
 – add_library(mylib STATIC ...)(静态库,.a/.lib)
 – add_library(mylib SHARED ...)(动态库,.so/.dll)
 – add_library(mylib INTERFACE ...)(纯头文件库,只传编译选项)
参数差异重点在依赖传递:INTERFACE 库的 target_include_directories(... INTERFACE ...) 会自动透传给链接它的目标;而 STATIC 默认不透传,得手动加 PUBLIC

为什么 find_package(Boost) 找不到,但系统明明装了 boost

根本原因不是“没装”,而是 CMake 不知道去哪里找——它默认只查系统级路径(如 /usr/lib/cmake/Boost),而 Homebrew/macOS 或自己编译安装的 Boost 往往在非标准位置。
容易踩的坑:
• 没设 CMAKE_PREFIX_PATH,比如 Homebrew 的 Boost 在 /opt/homebrew,就得加 -DCMAKE_PREFIX_PATH=/opt/homebrew
• 用了 find_package(Boost REQUIRED) 却没声明组件,比如要 filesystem,得写 find_package(Boost REQUIRED COMPONENTS filesystem),否则即使找到 Boost,也会因组件缺失报错
• Linux 上用包管理器装的 Boost(如 apt install libboost-filesystem-dev)通常自带 CMake config,但 macOS 的 brew install boost 默认不生成 BoostConfig.cmake,得靠 find_package(Boost ...) 的兼容模式,此时更依赖 BOOST_ROOT 环境变量

生成的 Makefile 为什么不重新编译改过的 .h 文件

CMake 本身能自动处理头文件依赖,但前提是:你声明的源文件列表里包含了所有实际参与编译的 .cpp,且这些 .cpp#include 的头文件路径是 CMake 能解析到的。
性能影响明显:漏掉依赖会导致修改头文件后不触发重编,产生静默错误。
实操要点:
• 不要用通配符(如 file(GLOB ...))收集源文件,CMake 无法据此推导头依赖,改了 .h 后不会清缓存重扫
• 所有 add_executable / add_library 的源文件列表必须显式列出每个 .cpp
• 如果头文件在非标准路径(如 include/),务必用 target_include_directories(mytarget PUBLIC include),否则 CMake 解析 #include "xxx.h" 时会跳过该路径,导致依赖链断裂

ARTi.PiCS
ARTi.PiCS

ARTi.PiCS是一款由AI驱动的虚拟头像生产器,可以生成200多个不同风格的酷炫虚拟头像

下载

立即学习C++免费学习笔记(深入)”;

头文件路径声明和源文件显式列举这两件事,看着琐碎,却是 CMake 增量构建可靠的唯一基础。漏一个,就可能让后续调试变成猜谜。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

78

2025.09.10

macOS怎么切换用户账户
macOS怎么切换用户账户

在 macOS 系统中,可通过多种方式切换用户账户。如点击苹果图标选择 “系统偏好设置”,打开 “用户与群组” 进行切换;或启用快速用户切换功能,通过菜单栏或控制中心的账户名称切换;还能使用快捷键 “Control+Command+Q” 锁定屏幕后切换。

364

2025.05.09

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1584

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

717

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

300

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

801

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

588

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

571

2023.07.20

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

7

2026.03.18

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号