cmake是什么,为什么现在都用cmake,cmake编译原理和跨平台示例

2023-05-16

一 cmake是什么?

 

CMake是一个开源、跨平台的工具系列,是用来构建、测试和打包软件。

CMake使用平台无关的配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用项目文件,比如可以生成vs项目文件或者makefile。CMake工具套件由Kitware公司创建,以满足ITK和VTK等开源项目对跨平台构建环境的需求。Kitware是一家从事医疗计算,高性能的可视化和计算,数据和分析,计算机视觉的公司。该公司成立于1998年。

二 为什么现在都用cmake?

1 为什么用cmake,这里有两个问题,首先要问为什么我需要一个好的构建系统?,下面是主要的原因:

  • 你想避免硬编码路径
  • 您需要在多台计算机上构建一个包
  • 你想使用 CI(持续集成)
  • 你需要支持不同的操作系统
  • 你想支持多个编译器
  • 您想使用 IDE,但不是所有情况
  • 你想描述你的程序的逻辑结构,而不是标志和命令
  • 你想使用库
  • 您想使用其他工具来帮助您编写代码 moc ProtoBuf
  • 你想使用单元测试

2 这里有个重要的需求,就是持续集成,下面我们来说明一下什么是持续集成,

  • 每次集成都通过自动化的制造(包括提交、发布、自动化测试)来验证,准确地发现集成错误。
  • 快速错误,每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易
  • 各种不同的更新主干,如果不经常集成,会导致集成的成本变大
  • 让产品可以快速地通过,同时保持关键测试合格
  • 自动化测试,只要有一个测试用例不通过就不能集成
  • 集成并不能删除发现的错误,而是让它们很容易发现和改正

3 那又为什么是cmake ?下面我们看下cmake的特性就知道为什么要选择它了:

cmake特性

  • 自动搜索可能需要的程序、库和头文件的能力
  • 独立的构建目录,可以安全清理
  • 创建复杂的自定义命令,例如qt moc uic
  • 配置时选择可选组件的能力
  • 从简单的文本文件(CMakeLists.txt)自动生成工作区和项目的能力
  • 在静态和共享构建之间轻松切换的能力
  • 在大多数平台上自动生成文件依赖项并支持并行构建

下面再说两个现实场景的原因:

  • 几乎每个 IDE 都支持 CMake( CMake 支持几乎所有IDE)
  • 使用 CMake 的软件包比任何其他构建系统都多

三 cmake编译原理 (cmake工作原理)

 

上面是我画的cmake原理流程图,有些复杂但基本描述了cmake的工作原理,更多内容可以看下cmake的官方手册 cmake.org.cn

四 cmake编译(Linux Windows MacOS系统构建示例)

1 环境准备

参考我的上一篇文章

《cmake使用方法详解 - Windows Linux MacOS cmake安装教程》

2 源码准备

源码准备,三个平台使用同一份c++源码和cmake配置

  • c++源码
//first_cmake.cpp 
#include <iostream> 
using namespace std; 
int main(int argc,char *argv[])
{ 
 cout<<"first cmake c++"<<endl; 
 return 0; 
}
  • CMake配置源码 CMakeLists.txt
    • cmake_minimum_required 指定最低的cmake版本
    • project 项目名称,后面可以通过变量获取此名称
# CMakeLists.txt 
cmake_minimum_required (VERSION 3.0) 
project (first_cmake) 
add_executable(first_cmake first_cmake.cpp)
  • 目录结构

CMakeLists.txt文件在根目录 ,c++源码first_cmake.cpp和其同一个目录。

 

 2 Windows平台编译

编译环境准备参考的上一篇文章

CMake=》vs项目=》cl编译

1 源码目录下面创建一个编译目录build,用于生成cmake的临时文件和项目文件,放在独立的目录方便清理和查看。

 

2 进入编译目录build,直接运行cmake .. 使用默认生成项目文件,下图生成的是vs2022的64位项目(文件所在的路径和目录层次不能太深,太深会找不到编译器)。

 

 3 编译项目

有两种编译方法,第一种直接进入build目录打开vs解决方案进行编译.第二种,控制台进入生成的项目文件路径 build,然后运行 cmake --build . 后面的点表示当前路径。

 

3 Linux平台编译

1 安装好gcc编译工具

sudo apt install g++

sudo apt install make

CMake=》makefile=》make使用gcc或者clang编译

可以手动创建build路径,然后与上面的windows编译方法一致。

还有一种方法

1 在CMakeLists.txt文件所在路径 ,运行

cmake -S . -B build

-S 后面是指定CMakeLists.txt文件的路径,-B后面是生成的编译临时目录路径。

使用默认生成项目文件,下图生成的是makefile + gcc (linux下 c++ 指向g++ ,cc指向gcc)

 2 编译项目

编译项目也有两种方法,

一种是直接使用生成的makefile文件

进入build目录输入 make 编译项目。

另一种是与windows编译方法一致,在项目根路径可以输入

cmake --build build

后面的build是cmake生成的文件所在路径

4 Mac平台编译

MacOS下的编译,基本与linux下一致,当然也可以选择生成为xcode的工程项目

 

sudo xcode-select --switch /Applications/Xcode.app/

cmake .. -G "Xcode"

cmake --build .

 

 

更多内容可以参考CMake官方手册 cmake.org.cn

--------------------------------------------

如果想要学习CMake更多内容,可以看下我的这门课程:

https://edu.csdn.net/course/detail/35972

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake是什么,为什么现在都用cmake,cmake编译原理和跨平台示例 的相关文章

  • stm32 printf 串口输出

    在使用STM32调试时 xff0c 经常使用串口发送信息 xff0c 为了方便调试与串口发送信息 xff0c 用printf xff08 xff09 函数实现通过串口打印信息 1 添加包含printf xff08 xff09 函数的头文件
  • 【slighttpd】基于lighttpd架构的Server项目实战(7)—http-parser

    对于http服务器 xff0c http request的解析是比较麻烦的 xff0c 由于我们的重点并不在这上面 xff0c 所以这一部分不打算自己编写 xff0c 而是使用开源的http parser库 xff0c 下面我们将使用该库来
  • C#实现以图搜图

    朋友们 xff0c 如需转载请标明出处 xff1a http blog csdn net jiangjunshow 前言 最近在逛淘宝时发现了淘宝的图片搜索功能 xff0c 可能是我太Low了这个技术点已经实现很长时间了 想想自己能不能实现
  • 床长人工智能教程 - 前言

    朋友们 如需转载请标明出处 xff1a http blog csdn net jiangjunshow 人工智能被认为是一种拯救世界 终结世界的技术 毋庸置疑 xff0c 人工智能时代就要来临了 xff0c 科幻电影中的场景将成为现实 xf
  • 如何做接口测试呢?接口测试有哪些工具【小白都会系列】

    回想入职测试已经10年时间了 xff0c 初入职场的我对于接口测试茫然不知 后来因为业务需要 xff0c 开始慢慢接触接口测试 从最开始使用工具进行接口测试到编写代码实现接口自动化 xff0c 到最后的测试平台开发 回想这一路走来感触颇深
  • C++有限状态自动机解析HTTP协议

    一 HTTP请求报文格式 HTTP请求报文主要由四部分组成 xff0c 分别为请求头 请求行 空行 请求体 xff1b 请求方法 请求方法包括GET HEAD PUT POST TRACE OPTIONS DELETE等 xff1b xff
  • 解析URL

    简介 在github有轮子http parser解析器 小的就不再造轮子了 xff0c 哈哈 xff08 造这个轮子真不是一时半会的事 xff09 目前该解析器用于nodejs的http解析 xff0c 另还有大家熟知的tcpflow 以及
  • ubuntu 串口调试助手

    ubuntu 下的串口调试助手推荐有两个 PuTTY 和 CuteCom PuTTY 除了串口通讯功能外还有 SSH 和 Telnet 等功能 CuteCom 只能用于串口通讯 但串口界面更友好 安装串口工具 ubuntu 标准安装源中包含
  • 数据的存储(1):字节序与比特序

    前言 在计算机的发展过程中 xff0c 由于不同硬件体系在数据高低有效位及存储方式理解上的差异 xff0c 出现了大端和小端这两种截然相反的对数据的位进行解释的模式 大小端模式本身没有优劣之分 xff0c 但我们在开发过程中 xff0c 需
  • [C/C++后端开发学习] 11 实现一个简单的HTTP服务器

    文章目录 实现GET方法约定GET时URI的格式状态机与websocket协议兼容实现几个辅助函数GET请求一个html页面 一张图片或一个PDF文件 实现POST方法实现一个简单的服务框架POST请求报文处理的代码块POST响应报文处理的
  • C++ Primer Plus习题及答案-第六章

    习题选自 xff1a C 43 43 Primer Plus 第六版 内容仅供参考 xff0c 如有错误 xff0c 欢迎指正 1 简单文件输入 输出 xff08 写入到文本文件中 xff09 对于文件输入 xff0c C 43 43 使用
  • 航模电池-LiPo锂聚合物电池(未完待续)

    一 外形 1 一般有几个电芯 xff0c 就是几 S xff0c 比如三个电芯就是3S 2 从电池上 xff0c 会引出两组导线 xff0c 一组细的 xff0c 一组粗的 细的一组 xff0c 由一根红线和若干根黑线组成 xff0c 最前
  • visual studio 编译C++程序,加快编译速度

    网上很多有关于选择预编译选项出现 xff0c fatal error C1083 无法打开预编译头文件 pch No such file or directory xff0c 这样的错误 xff0c 好多人会选择直接不使用预编译选项 如果工
  • C++中标准名称空间出错(cout,cin,endl是一个未知标识符)

    相信有很多小伙伴刚刚学习C 43 43 都有出现cout cin endl为未知标识符 原因是 xff1a lt iostream gt 头文件没有namespace std库 解决方法有3种 xff0c 如下 方法1 xff1a 加 us
  • C++源文件编译过程

    对于C 43 43 源文件 xff0c 从文本到可执行文件一般需要四个过程 xff1a 预处理阶段 编译阶段 汇编阶段 链接阶段 预处理阶段 xff1a 对源代码文件中文件包含关系 xff08 头文件 xff09 预编译语句 xff08 宏
  • 最短路径算法之AStar算法(一) AStar算法的证明

    本文并不试图对A Star算法进行一个入门式的讲解 xff0c 因为光是那个讲解就有可能会占据很长的篇幅 xff0c 而且网上已经有讲解的文章 xff0c 讲的肯定比我好 所以 xff0c 本文是面向已经对A Star算法有了一定了解的人
  • 最短路径算法之AStar算法(三) 《A* Pathfinding for Beginners》一文中的两个问题

    现在 xff0c 看看网上流传的很广的一篇文章 A Pathfinding for Beginners xff0c 经典的A STar算法的入门文章 xff0c 也是我前面推荐的阅读文章 个人认为 xff0c 这篇入门文章的算法不能找出最短
  • 最短路径算法之AStar算法(四) 可变H函数

    前面的文章已经讨论过 xff0c 当H函数可变时 xff0c 前面给出的AStar算法伪过程存在问题 xff0c 并且通过实际的例子证明了问题的存在 现在 xff0c 让我们具体分析一下问题究竟出现在什么地方 我们回顾一下AStar算法的证
  • 物流定位系统项目qt代码

    头文件 ifndef USER INTERFACE H define USER INTERFACE H include lt QWidget gt include lt QLabel gt include lt QMouseEvent gt
  • python中运用urllib.request简单抓取网页数据

    urllib request 1 抓取百度首页 1 from urllib import request 2 3 url 4 根据url获取数据 xff0c 下载数据到本地 5 正则orXpath处理数据 6 数据转储 7 8 url 61

随机推荐

  • STM32基础知识之串口通信协议

    串口通信协议 串口的硬件缓存允许收发一次大小都是一字节 xff08 比如0xAA xff09 xff0c 而由串口多次发送的数据的多个字节组成了一帧数据 xff0c 这帧数据被缓存在了软件定义的一个数组中 一帧数据的典型格式如下 第一次发送
  • DataX实现mysql全量数据同步到hdfs

    目录 一 xff1a 什么是DataX 1 1 DataX的概述 xff1a 1 2 DataX的设计 xff1a 1 3 支持的数据库 1 4 框架设计 xff1a 1 5 运行原理 xff1a 1 6 与 Sqoop 的对比 二 xff
  • 16KM数传电台

    1 http www dlmytech com products detail productId 61 85 html
  • C语言中怎么将int类型的数据转换为字符串(STM32程序)

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 字节序(byte order)和位序(bit order)

    一 网络字节序与主机字节序 在Linux网络编程中 xff0c 经常碰到网络字节序与主机字节序的相互转换 说到网络字节序与主机字节序需要清晰了解以下几个概念 1 字节序 字节序 xff0c 顾名思义 xff0c 指字节 Byte 在内存中存
  • 虚拟机和主机相互ping不通方法总结

    一 虚拟机和主机相互ping不通的解决方法 1 主要检查几个方面 xff1a 1 xff09 检查虚拟网卡有没有被禁用 2 xff09 检查虚拟机与物理机是否在一个VMNet中 3 xff09 检查虚拟机的IP地址与物理机对应的VMNet是
  • grafana告警规则设置

    Linux 内存告警配置 问题 xff1a Template variables are not supported in alert queries 解决办法 xff1a 单独配置个告警的视图 xff0c 用正则匹配出所有的主机 或者 每
  • 无法启动此程序因为计算机中丢失vcruntime140_1.dll

    安装mysql8的时候发现需要VCRUNTIME140 1 dll文件 该文件在C Windows System32下面 解决方法 推荐去微软官网下载最新的2015 2019vc 43 43 支持包 https support micros
  • Failed to start mysqld.service: Unit not found问题解决方案

    1 首先安装mariadb server yum install y mariadb server 2 启动服务 systemctl start mariadb service 3 添加到开机启动 systemctl enable mari
  • 【常见】CSS3进度条Loading动画(一)

    现在 xff0c GIF 格式的进度条已经越来越少 xff0c CSS 进度条如雨后春笋般涌现 CSS3的崛起 xff0c 更使得动态效果得以轻松实现 xff0c 未来 xff0c 必定是CSS3的天下 xff0c 所以今天我就来分享一下几
  • ssh免密报错:Could not resolve hostname : Name or service not known

    解决方法 xff1a 需要将对应的ip地址加到文件名 etc hosts中 如 xff1a 192 168 128 129 cdh1 192 168 128 130 cdh2 192 168 128 131 cdh3
  • Failed to execute operation: No such file or directory

    安装iptables服务 yum span class token function install span iptables services 然后再执行 xff1a systemctl enable iptables service
  • 为什么块的大小不能设置太小,也不能设置太大?

    xff08 1 xff09 HDFS的块设置太小 xff0c 会增加寻址时间 xff0c 程序一直在找块的开始位置 xff1b xff08 2 xff09 如果块设置的太大 xff0c 从磁盘传输数据的时间会明显大于定位这个块开始位置所需的
  • 深入理解混洗过程

    混洗过程 Map方法之后 xff0c Reduce方法之前的数据处理过程称之为Shuffle 混洗过程 map方法之后 首先进入getpartition方法 标记数据属于那个分区 并打上分区编号 因为后续的数据都是按分区处理 不同分区数据会
  • 大数据集群写数据流程原理分析

    写入数据流程 即客户端如何把数据写入hdfs集群 底层原理如下 右侧为hdfs集群 含有NameNode和DataNode节点 左侧为客户端准备把数据传送到集群 首先创建客户端 分布式的文件系统 创建好客户端后向NameNode请求 Nam
  • 集群资源管理基础架构和工作机制

    Yarn的基础架构 RM为整个yarn集群资源老大 NM为单个节点资源老大 AM为单个应用程序的资源老大 container容器 xff0c 集群的资源抽象 最小单位 xff1b Yarn工作机制 Job gt RM 在命令行上执行一个wc
  • OpenSSL 3.0 版本已经发布VS2019编译源码教程

    1 OpenSSL 3 0版本在2020年五月发布 OpenSSL3 0 在2020年5月发布了第一个版本 xff0c 随即在六月份又发布了一些alpha版本 xff0c 版本修正了一些bug xff0c 增加了一些协议支持 xff0c 继
  • FFmpeg 4.3 源码在windows上的编译

    FFmpeg开发环境准备 nbsp nbsp 学习目标 nbsp nbsp nbsp 学会配置vs2019 msys2 编译环境 nbsp nbsp nbsp 学会编译x264 x265 fdk aac sdl ffmpeg4 3 编译目的
  • cmake使用方法详解 - Windows Linux MacOS cmake安装教程

    一 什么是CMake xff0c 为什么要使用它 CMake 是用于构建 测试和软件打包的开源跨平台工具 xff0c 为什么要用cmake xff0c 是因为我们需要一个构建系统解决如下问题 xff1a 1 你想避免硬编码路径 2 您需要在
  • cmake是什么,为什么现在都用cmake,cmake编译原理和跨平台示例

    一 cmake是什么 xff1f CMake是一个开源 跨平台的工具系列 xff0c 是用来构建 测试和打包软件 CMake使用平台无关的配置文件来控制软件编译过程 xff0c 并生成可在您选择的编译器环境中使用项目文件 xff0c 比如可