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

Cmake基础教程--第1章:初识cmake

Cmake基础教程--第1章:初识cmake

  • 何为Cmake
  • Cmake的优缺点
    • 优点
    • 缺点
  • Cmake与makefile之间的关系
  • C/C++ 如何编译为可执行文件
  • 一个最简单的Cmake示例

从本篇文章开始,我会出一系列文章,致力于Cmake工具的学习使用。阅读本文章之前,
作者默认读者会使用基础的命令行工具且具有C++基础。

何为Cmake

首先,Cmake是一个开源的,跨平台的自动化构建工具,它使用一组简单的描述性语言来生成本地构建环境,使用cmake工具,我们可以很好的去管理我们的项目。

对比于其他编程语言的构建工具,Cmake无疑复杂了很多,但这是由于 C++ 古老的编译模型和关注于底层的特性导致的。也正是由于Cmake的出现,才为C++真正提供了可靠的跨平台解决方案

注意

  • Cmake并非是包管理工具
  • Cmake不仅仅支持C++,Cmake实际支持相当多种语言

对于C++程序员来说,学习Cmake几乎是必经之路。

Cmake的优缺点

优点

  1. 跨平台支持: Cmake是真正的跨平台工具,支持大多数主流的操作系统(相比之下makefile就不具备良好的跨平台性)
  2. 与IDE集成度好: Cmake几乎可以用于生成所有主流IDE的项目文件,使得开发者可以使用自己所习惯的开发环境。
  3. 广泛的社区支持: CMake 拥有庞大的用户群和活跃的社区,这意味着有大量的文档、教程和示例可供参考,遇到问题时也容易找到解决方案。

缺点

  1. 学习成本高: Cmake是一门语言,初学者需要花相当大的精力来学习
  2. 更新频繁: Cmake仍旧在发展成长,新版本可能引入不兼容的更改,这要求项目必须持续跟进和适配

Cmake与makefile之间的关系

相信很多人都曾认为过Cmake的功能就是去生成对应的makfile,其实这样的认知是错误的。
Cmake并不一定会生成Makefile,这是由你使用的编译器决定的,只是由于大部分情况是
生成makefile,才给了大家错误的认知。

也由于Cmake构建项目时并不一定会生成makefile,所以不建议cmake搭配make使用。

C/C++ 如何编译为可执行文件

在正式学习Cmake之前,先来了解一下C/C++的基本编译原理。一般来说,可以分为以下四步:

  • 预处理: 进行宏替换,展开内联函数,处理条件编译指令(#if之类),以及将头文件内容插入到当前文件中,经过预处理阶段后,源文件会变为一个没有预处理指令的干净的文件。
  • 编译 读取预处理后的源代码并将其转换为汇编代码或目标代码,在此期间,译器还会进行各种优化,以提高生成代码的效率。
  • 汇编 汇编器将汇编代码转换为机器语言指令的二进制形式,也就是目标代码或对象文件。每个源文件通常会被编译和汇编成单独的对象文件。
  • 链接 链接器解析未定义的符号引用,将它们与定义在其他模块或库中的符号匹配。链接器还会重定位代码和数据,使其在内存中处于正确的地址,同时合并数据段和代码段,生成最终的可执行文件。

一个最简单的Cmake示例

我们在项目目录中编写一个名为main.cpp的源文件,接下来演示如何使用Cmake来构建这个
简单项目。
main.cpp

  1. 编写 CMakeLists.txt 文件
    在工程目录下编写一个名为CMakeLists.txt的文件,这里注意大小写不要拼错。在CMakeLists.txt中编写以下代码:
cmake_minimum_required(VERSION 3.20) #指定最小版本
project(HELLO) #指定项目名
add_executable(test main.cpp) #指定由源文件main.cpp生成可执行文件test

这里注意#为cmake语法中的注释,每行代码的功能已经在代码中指出,使用该cmake可以使用main.cpp来编译出可执行文件test。其中project指定的项目名与生成的可执行文件名称并无关系。

  1. 使用cmake生成makefile或其他文件
    在工程目录使用以下命令来生成makefile或其他的文件(注意这里的环境会生成makefile,但这并不是绝对的,例如在msvc下就不会生成makefile而是其他的文件,后文均以makfile举例)
cmake -B [目录名称]

如下:
cmake -B build
该命令会指定一个文件夹的名称,然后生成这个目录,会将makefile相关的文件放入build目录中,注意,在大部分情况下,我们都不应该修改该目录下的文件内容。
3. 生成项目
使用如下命令来生成项目:

cmake --build [目录名称]

如下:
build
命令的目录应当与上一步生成的目录一致,执行完之后,会在该目录下生成对应的可执行文件。注意,在本例中,你直接在build的目录下使用make命令也能编译得到正确的可执行文件,但这不是我们赞成的行为。

至此,你就完成了一个最简单的Cmake的工程构建。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python实现返回指定下标位置的 斐波那契数列[1,1,2,3,5,8,13,21,34....n] 数值
  • 基于Springboot + Vue的宿舍管理系统
  • 思特威正式发布子品牌飞凌微,首发产品定位智驾视觉处理
  • chromedriver版本下载地址汇总chromedriver所有版本下载地址汇总国内源下载
  • 在 Mac 上恢复永久删除的文件:分步指南
  • 谷粒商城实战笔记-117-全文检索-ElasticSearch-进阶-term查询
  • 本地部署 Llama-3-EvoVLM-JP-v2
  • 分布式事务一站式解决方案-Seata
  • 【OpenCV C++20 学习笔记】物体检测-Ballard和Guil霍夫变换
  • 常见框架漏洞 上 (Thinkphp、struts2、Spring、Shiro)
  • Linux中NFS配置
  • 【实现100个unity特效之15】最简单的方法使用shader graphs实现2d非像素和像素树叶草的随风摇摆效果
  • 在Linux上安装Conda以支持Go 1.19
  • 快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型(曙光超算互联网平台异构加速卡DCU)
  • 快速掌握Vue:基础命令详解
  • 《深入 React 技术栈》
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【剑指offer】让抽象问题具体化
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • angular2开源库收集
  • Apache的基本使用
  • hadoop集群管理系统搭建规划说明
  • JavaScript HTML DOM
  • Linux后台研发超实用命令总结
  • Redis学习笔记 - pipline(流水线、管道)
  • 闭包--闭包作用之保存(一)
  • 复杂数据处理
  • 每天一个设计模式之命令模式
  • 入门级的git使用指北
  • 算法---两个栈实现一个队列
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • # 数论-逆元
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (13)Hive调优——动态分区导致的小文件问题
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Ruby)Ubuntu12.04安装Rails环境
  • (搬运以学习)flask 上下文的实现
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (实战篇)如何缓存数据
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 指南:抽象化实现的基类
  • .NET 中的轻量级线程安全
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .Net实现SCrypt Hash加密