C++进阶 Cmake

发布时间:2026/9/25 9:39:05

C++进阶 Cmake
一.makefile和Cmake对比makefile的执行过程写一个脚本文件CMake可以生成makefile文件的底层的学习makefile接触的比较多二.CMake1.1 Cmake工程流程1 在不使用CMake时编译工程如下2 在上面的机制中工程文件中添加一个源程序 bar.cpp3 使用CMake来管理工程的状态4 使用CMkake管理工程中添加一个新文件 bar.cpp1.2 语法特性介绍1 基本语法指令参数1 参数2 ...参数使用括号括起来参数之间使用空格或分号隔开2 注意指令是大小写无关的但是参数和变量是大小写相关的set(HELLO hello.cpp) # 定义一个变量名叫HELLO 变量的值为hello.cppadd_executable(hello main.cpp hello.cpp) # 通过main.cpp 和hello.cpp 编译生成这里的hello可执行程序名ADD_EXECUTABLE(hello main.cpp ${HELLO}) # 作用同上3 变量使用${}进行取值但是在if控制语句中是直接使用变量名的if(HELLO) 是正确的if(${HELLO}) 是不正确的4 语句不以分号结束7.4 重要的指令1 cmake_minimum_required:指定CMake的最小版本支持,一般作为第一条cmake指令# CMake设置最小支持版本为 2.8cmake_minimum_required(VERSION 2.8)2 project定义工程的名称并可以指定工程支持的语言# 指定工程的名称为HELLOWORLDproject(HELLOWORLD CXX) # 表示工程名为HELLOWORLD 使用的语言为C3 set:显式定义变量# 定义变量 SRC 其值为 sayhello.cpp hello.cppset(SRC sayhello.cpp hello.cpp)4 add_executable:通过依赖生成可执行程序# 编译main.cpp 生成main的可执行程序add_executable(main main.cpp)5 include_directories:向工程添加多个特定的头文件搜索路径吗类似于g编译指令中的 -I# 将/usr/lib/mylibfolder 和 ./include添加到工程路径中include_directories(/usr/lib/mylibfolder ./include)6 link_directories:向工程中国添加多个特定的库文件搜索路径类似于g编译指令的 -L选项# 将将/usr/lib/mylibfolder 和 ./lib添加到库文件搜索路径中link_directories(/usr/lib/mylibfolder ./lib)7 add_library:生成库文件包括动态库和静态库# 通过SRC 变量中的文件生成动态库add_library(hello SHARED ${SRC}) # 该语句生成的是动态库add_library(hello STATIC ${SRC}) # 该语句生成的是静态库8 add_compile_options:添加编译参数# 添加编译参数 -Wall -stdc11add_compile_options(-Wall -stdc11)9 target_link_libraries:为target添加需要链接的共享库,类似于g编译中的 -l 指令# 将hello 动态库文件链接到可执行程序main中target_link_libraries(main hello)7.5 CMake常用变量1 CMAKE_C_FLAGSgcc编译选项的值2 CMAKE_CXX_FLAGSg编译选项的值# 在CMAKE_CXX_FLAGS编译选项后追加 -stdc11set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -stdc11)3 CMAKE_BUILD_TYPE编译类型Debug 、Release# 设定编译类型为Debug调试时需要选择该模式set(CMAKE_BUILD_TYPE Debug)# 设定编译类型为Release发布需要选择该模式set(CMAKE_BUILD_TYPE Release)三.CMake工程实战7.6 CMake编译工程CMake目录结构项目主目录中会放一个CMakeLists.txt的文本文档后期使用cmake指令时依赖的就是该文档1 包含源文件的子文件夹中包含CMakeLists.txt文件时主目录的CMakeLists.txt要通过add_subdirector添加子目录2 包含源文件的子文件夹中不包含CMakeLists.txt文件时子目录编译规则体现在主目录中的CMakeLists.txt7.6.1 两种构建方式 推荐外部构建1 内部构建不推荐使用内部构建会在主目录下产生一大堆中间文件这些中间文件并不是我们最终所需要的和工程源文件放在一起时会显得比较杂乱无章## 内部构建# 在当前目录下编译主目录中的CMakeLists.txt 文件生成Makefile文件执行语法cmake .# . 表示当前路径# 执行make命令生成目标文件执行语法make2 外部构建推荐使用将编译输出的文件与源文件放到不同的目录下进行编译此时编译生成的中间文件不会跟工程源文件进行混淆## 外部构建步骤# 1、在当前目录下创建一个 build 文件用于存储生成中间文件mkdir build# 2、进入build文件夹内cd build# 3、编译上一级目录中的CMakeLists.txt,生成Makefile文件以及其他文件cmake ..# ..表示上一级目录# 4、执行make命令生成可执行程序make7.7 CMake代码实战7.7.1 同一目录下的文件进行编译1 源文件2 CMakeLists.txt文件3 内部构建4 外部编译7.7.2 分文件编译1 头文件2 源文件3 测试文件4 分文件编译使用g编译器生成可执行程序5 创建工程管理文件 CMakeLists.txt

相关新闻

Claude Code原生安装与权限工作流实战指南

Claude Code原生安装与权限工作流实战指南

2026/8/22 23:59:15

1. 项目概述:这不是又一个“AI编程助手”安装教程,而是一份面向真实开发场景的Claude Code实战手册 “2026 Claude Code 最全使用指南”这个标题里,“最全”两个字不是噱头,而是我过去18个月在三个不同技术栈(前端微服…

RAG 上线后怎么排查问题?日志与可观测性

RAG 上线后怎么排查问题?日志与可观测性

2026/8/22 23:59:15

上一篇文章里,我们讨论了 RAG 如何降低成本。 一个重要结论是: 缓存、摘要、分层检索和上下文控制,能显著降低系统运行成本。 但当 RAG 真正上线以后,还有一个更现实的问题会很快出现: 出问题了,怎么查&…

Turbowarp文本换行难题解析:字符编码原理与3种实用解决方案

Turbowarp文本换行难题解析:字符编码原理与3种实用解决方案

2026/8/22 23:59:15

你是不是也遇到过这样的问题:在Turbowarp里想要让文本换行显示,却发现按回车键根本不起作用?明明在其他编程环境里很简单的换行操作,在Turbowarp里却变成了一个让人头疼的技术难题。其实,Turbowarp的文本换行问题背后隐…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/23 22:20:06

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/23 14:32:22

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/24 3:39:17

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/23 14:31:31

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/25 8:58:17

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/23 14:34:03

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/24 16:02:49

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/21 23:38:13

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/25 4:22:14

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…