cmake、make、makefile、ninga的关系
CMake是一种跨平台的构建系统,它用来管理软件的编译过程。CMake可以生成本地平台特定的构建文件,例如Makefile或者Microsoft Visual Studio项目文件,以便开发人员更轻松地在不同的平台上构建他们的项目。它的主要功能是配置和生成构建脚本,这些脚本可以在不同的编译器和操作系统上运行。
CMake的功能和特点
- 跨平台支持:CMake支持各种操作系统和编译器,如Windows、Linux、macOS,以及GCC、Clang、MSVC等编译器。
- 生成构建文件:CMake可以生成Makefile、Ninja build文件、Visual Studio项目文件等。
- 模块化和可扩展:CMake使用模块系统,允许用户创建和使用自定义模块和脚本。
- 构建配置:CMake支持构建配置,如调试和发布版本的构建。
- 简化复杂项目的管理:对于大型项目,CMake可以管理多层次和多模块的构建需求。
Makefile和CMake的关系
- Makefile:是一个脚本文件,定义了编译和链接程序所需的规则和依赖关系。Makefile通常与
make工具一起使用。 - CMake:是一个更高级别的工具,它生成构建系统的输入文件(如Makefile)。CMake通过读取配置文件(通常是
CMakeLists.txt)来生成Makefile或其他构建系统的文件。
使用CMake生成Makefile的流程
- 编写CMakeLists.txt文件:定义项目的源文件、目标文件、依赖关系和编译选项等。
- 运行CMake:在命令行中运行
cmake命令,这将解析CMakeLists.txt文件并生成Makefile。 - 运行make:在生成的Makefile所在的目录中运行
make命令,进行实际的编译和构建。
示例
假设我们有一个简单的项目,包含一个源文件main.cpp。我们可以通过以下步骤使用CMake生成Makefile并编译项目:
-
编写CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.10) project(MyProject)set(CMAKE_CXX_STANDARD 11)add_executable(MyExecutable main.cpp) -
运行CMake生成Makefile:
mkdir build cd build cmake .. -
运行make编译项目:
make
通过这些步骤,CMake会生成一个Makefile,然后make工具会根据这个Makefile编译和链接项目。
总结来说,CMake简化了跨平台构建的复杂性,自动生成适合目标平台的构建文件,而Makefile则是其中一种具体的构建文件类型。CMake使得管理复杂项目的构建过程更加高效和可移植。
CMake、Make和Ninja都是与软件构建相关的工具,但它们的角色和功能有所不同,它们之间的关系可以通过以下方式来理解:
CMake
CMake是一种跨平台的构建系统生成器,它的主要功能是生成本地平台特定的构建脚本。 CMake的工作流程如下:
- 编写CMakeLists.txt文件:用户在项目中编写一个或多个
CMakeLists.txt文件,描述项目的源文件、依赖关系、构建选项等。 - 运行CMake:CMake读取
CMakeLists.txt文件,并生成构建系统的输入文件(例如Makefile或Ninja build文件)。 - 选择构建系统:CMake可以生成多种类型的构建系统输入文件,包括Makefile、Ninja build文件、Visual Studio项目文件等。
Make
Make是一个构建自动化工具,最常与Makefile配合使用。Makefile是一种脚本文件,定义了构建项目的规则和依赖关系。Make的工作流程如下:
- 读取Makefile:Make工具读取Makefile文件。
- 执行规则:Make根据Makefile中定义的规则和依赖关系,自动化地执行编译和链接命令,以生成目标文件(如可执行文件或库)。
Ninja
Ninja也是一个构建系统工具,专注于快速、高效的构建过程。与Make类似,Ninja使用自己的构建文件(通常名为build.ninja)来定义构建规则和依赖关系。Ninja的特点包括:
- 高性能:Ninja专为速度优化,能够快速执行并行构建。
- 简单的文件格式:Ninja的构建文件格式简单直接,适合自动生成。
CMake、Make和Ninja的关系
- CMake与Make和Ninja:CMake是一个更高级别的工具,用于生成Make和Ninja使用的构建文件。用户编写CMakeLists.txt文件,然后使用CMake生成Makefile或Ninja build文件。
- Make与Makefile:Make使用Makefile文件来定义构建规则和依赖关系,并执行这些规则以构建项目。
- Ninja与build.ninja文件:Ninja使用
build.ninja文件来定义构建规则和依赖关系,并执行这些规则以构建项目。
工作流程示例
假设我们有一个简单的C++项目,其中有一个main.cpp文件,我们可以通过CMake生成Makefile或Ninja build文件来构建项目:
-
编写CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.10) project(MyProject)set(CMAKE_CXX_STANDARD 11)add_executable(MyExecutable main.cpp) -
生成Makefile:
mkdir build cd build cmake -G "Unix Makefiles" .. make -
生成Ninja build文件:
mkdir build cd build cmake -G "Ninja" .. ninja
在这个示例中,我们首先使用CMakeLists.txt文件定义项目,然后运行CMake以生成适当的构建文件(Makefile或Ninja build文件),最后使用对应的构建工具(Make或Ninja)来进行实际的构建过程。
总结来说,CMake负责生成构建系统的输入文件(如Makefile和Ninja build文件),而Make和Ninja则负责读取这些文件并执行实际的构建过程。CMake提供了一种更高层次的方式来管理和生成这些构建文件,从而简化跨平台构建的复杂性。
相关文章:
cmake、make、makefile、ninga的关系
CMake是一种跨平台的构建系统,它用来管理软件的编译过程。CMake可以生成本地平台特定的构建文件,例如Makefile或者Microsoft Visual Studio项目文件,以便开发人员更轻松地在不同的平台上构建他们的项目。它的主要功能是配置和生成构建脚本&am…...
StarRocks详解
什么是StarRocks? StarRocks是新一代极速全场景MPP数据库(高并发数据库)。 StarRocks充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果。 1.可以在Spark和Flink里面处理数据,然后将处理完的数据写到StarRo…...
【C语言】进程间通信之管道pipe
进程间通信之管道pipe 一、进程间通信管道pipe()管道的读写行为 最后 一、进程间通信 管道pipe() 管道pipe也称为匿名管道,只有在有血缘关系的进程间进行通信。管道的本质就是一块内核缓冲区。 进程间通过管道的一端写,通过管道的另一端读。管道的读端…...
03.VisionMaster 机器视觉 位置修正 工具
VisionMaster 机器视觉 位置修正 工具 官方解释:位置修正是一个辅助定位、修正目标运动偏移、辅助精准定位的工具。可以根据模板匹配结果中的匹配点和匹配框角度建立位置偏移的基准,然后再根据特征匹配结果中的运行点和基准点的相对位置偏移实现ROI检测…...
Oracle 是否扼杀了开源 MySQL
Oracle 是否无意中扼杀了开源 MySQL Peter Zaitsev是一位俄罗斯软件工程师和企业家,曾在MySQL公司担任性能工程师。大约15年前,当甲骨文收购Sun公司并随后收购MySQL时,有很多关于甲骨文何时“杀死MySQL”的讨论。他曾为甲骨文进行辩护&#…...
机器学习归一化特征编码
特征缩放 因为对于大多数的机器学习算法和优化算法来说,将特征值缩放到相同区间可以使得获取性能更好的模型。就梯度下降算法而言,例如有两个不同的特征,第一个特征的取值范围为1——10,第二个特征的取值范围为1——10000。在梯度…...
抛光粉尘可爆性检测 打磨粉尘喷砂粉尘爆炸下限测试
抛光粉尘可爆性检测 抛光粉尘的可爆性检测是一种安全性能测试,用于确定加工过程中产生的粉尘在特定条件下是否会爆炸,从而对生产安全构成威胁。如果粉尘具有可爆性,那么在生产环境中就需要采取相应的防爆措施。粉尘爆炸的条件通常包括粉尘本身…...
python14 字典类型
字典类型 键值对方式,可变数据类型,所以有增删改功能 声明方式1 {} 大括号,示例 d {key1 : value1, key2 : value2, key3 : value3 ....} 声明方式2 使用内置函数 dict() 创建1)通过映射函数创建字典zip(list1,list2) 继承了序列的所有操作 …...
深入了解 .url文件中的 Prop3属性
在使用 Windows 操作系统时,我们经常会遇到以 .url 结尾的文件,它们通常被用来快速访问互联网上的特定网页。这些文件虽然看起来简单,但其中包含的 Prop3 属性却有其特殊的作用和意义。 1. Prop3 是什么? 在 .url 文件中&#x…...
vue3+vite:动态引入静态图片资源
目录 第一章 前言 第二章 vue2与vue3动态引入静态图片资源 2.1 vue2 webpack动态引入静态图片资源 2.1.1 了解 2.1.2 vue2项目动态引入静态图片资源 2.2 vue3 vite动态引入静态图片资源 2.2.1 了解 2.2.2 require vs import了解 2.2.3 vue3vite 项目动态引入静态图片…...
【K8s】专题五(3):Kubernetes 配置之 ConfigMap 与 Secret 异同
以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号! 目录 一、相同点 二、不同点 一、相同点 功能作用:ConfigMap 与 Secret 都用于存储…...
用Python分析《三国演义》中的人物关系网
用Python分析《三国演义》中的人物关系网 三国演义获取文本文本预处理分词与词频统计引入停用词后进行词频统计构建人物关系网完整代码 三国演义 《三国演义》是中国古代四大名著之一,它以东汉末年到晋朝统一之间的历史为背景,讲述了魏、蜀、吴三国之间…...
k8s上使用ConfigMap 和 Secret
使用ConfigMap 和 Secret 实验目标: 学习如何使用 ConfigMap 和 Secret 来管理应用的配置。 实验步骤: 创建一个 ConfigMap 存储应用配置。创建一个 Secret 存储敏感信息(如数据库密码)。在 Pod 中挂载 ConfigMap 和 Secret&am…...
hexo实战:(二)个人独立博客优化合集
前言 上次介绍了使用 HexoGitHub Pages,零成本搭建一个专属自己的独立博客网站。我觉得那篇文章是没有入门门槛的,不管你是什么行业,只要想打造个人 IP,又不太想受博客平台约束,那么读完后动手操作一下也能轻松完成。…...
PostgreSQL的pg_relation_filepath函数
PostgreSQL的pg_relation_filepath函数 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777在 PostgreSQL 中&…...
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
文章目录 一、vue中使用el-table的typeindex有时不显示序号Table 表格显示索引自定义索引报错信息解决方案 二、vue中Missing required prop: “value” 报错报错原因解决方案 三、el-table的索引值index在翻页的时候可以连续显示方法一方法二 四、vue3中Element Plus全局组件配…...
安装golang
官网:All releases - The Go Programming Language (google.cn) 下载对应的版本安装即可...
Kubernetes面试整理-Kubernetes的主要组件有哪些?
Kubernetes 的主要组件分为控制平面组件和节点组件。以下是每个组件的详细介绍: 控制平面组件 1. API 服务器(kube-apiserver): ● 是 Kubernetes 控制平面的前端,接收、验证并处理所有的 API 请求。 ● 提供集群的管理接口,所有的集群操作都是通过 API 服务器进行的。...
力扣hot100: 48. 旋转图像
LeetCode:48. 旋转图像 受到力扣hot100:54. 螺旋矩阵的启发,我们可以对旋转图像按层旋转,我们只需要记录四个顶点,并且本题是一个方阵,四个顶点就能完成图像的旋转操作。 1、逐层旋转 注意到࿰…...
基于FPGA的VGA协议实现
目录 一、VGA简介 二、VGA引脚的定义 三、VGA显示原理: 四、VESA标准下的VGA时序: 五、VGA显示模式以及相关参数: 六、数字信号与模拟信号的转换 实战演练一:VGA显示彩条 1、实验目标 2、各模块框图及其波形图 3、模块代…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
MeanFlow:何凯明新作,单步去噪图像生成新SOTA
1.简介 这篇文章介绍了一种名为MeanFlow的新型生成模型框架,旨在通过单步生成过程高效地将先验分布转换为数据分布。文章的核心创新在于引入了平均速度的概念,这一概念的引入使得模型能够通过单次函数评估完成从先验分布到数据分布的转换,显…...
第2课 SiC MOSFET与 Si IGBT 静态特性对比
2.1 输出特性对比 2.2 转移特性对比 2.1 输出特性对比 器件的输出特性描述了当温度和栅源电压(栅射电压)为某一具体数值时,漏极电流(集电极电流...
