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

cmake、make、makefile、ninga的关系

CMake是一种跨平台的构建系统,它用来管理软件的编译过程。CMake可以生成本地平台特定的构建文件,例如Makefile或者Microsoft Visual Studio项目文件,以便开发人员更轻松地在不同的平台上构建他们的项目。它的主要功能是配置和生成构建脚本,这些脚本可以在不同的编译器和操作系统上运行。

CMake的功能和特点

  1. 跨平台支持:CMake支持各种操作系统和编译器,如Windows、Linux、macOS,以及GCC、Clang、MSVC等编译器。
  2. 生成构建文件:CMake可以生成Makefile、Ninja build文件、Visual Studio项目文件等。
  3. 模块化和可扩展:CMake使用模块系统,允许用户创建和使用自定义模块和脚本。
  4. 构建配置:CMake支持构建配置,如调试和发布版本的构建。
  5. 简化复杂项目的管理:对于大型项目,CMake可以管理多层次和多模块的构建需求。

Makefile和CMake的关系

  • Makefile:是一个脚本文件,定义了编译和链接程序所需的规则和依赖关系。Makefile通常与make工具一起使用。
  • CMake:是一个更高级别的工具,它生成构建系统的输入文件(如Makefile)。CMake通过读取配置文件(通常是CMakeLists.txt)来生成Makefile或其他构建系统的文件。

使用CMake生成Makefile的流程

  1. 编写CMakeLists.txt文件:定义项目的源文件、目标文件、依赖关系和编译选项等。
  2. 运行CMake:在命令行中运行cmake命令,这将解析CMakeLists.txt文件并生成Makefile。
  3. 运行make:在生成的Makefile所在的目录中运行make命令,进行实际的编译和构建。

示例

假设我们有一个简单的项目,包含一个源文件main.cpp。我们可以通过以下步骤使用CMake生成Makefile并编译项目:

  1. 编写CMakeLists.txt文件

    cmake_minimum_required(VERSION 3.10)
    project(MyProject)set(CMAKE_CXX_STANDARD 11)add_executable(MyExecutable main.cpp)
    
  2. 运行CMake生成Makefile

    mkdir build
    cd build
    cmake ..
    
  3. 运行make编译项目

    make
    

通过这些步骤,CMake会生成一个Makefile,然后make工具会根据这个Makefile编译和链接项目。

总结来说,CMake简化了跨平台构建的复杂性,自动生成适合目标平台的构建文件,而Makefile则是其中一种具体的构建文件类型。CMake使得管理复杂项目的构建过程更加高效和可移植。


CMake、Make和Ninja都是与软件构建相关的工具,但它们的角色和功能有所不同,它们之间的关系可以通过以下方式来理解:

CMake

CMake是一种跨平台的构建系统生成器,它的主要功能是生成本地平台特定的构建脚本。 CMake的工作流程如下:

  1. 编写CMakeLists.txt文件:用户在项目中编写一个或多个CMakeLists.txt文件,描述项目的源文件、依赖关系、构建选项等。
  2. 运行CMake:CMake读取CMakeLists.txt文件,并生成构建系统的输入文件(例如Makefile或Ninja build文件)。
  3. 选择构建系统:CMake可以生成多种类型的构建系统输入文件,包括Makefile、Ninja build文件、Visual Studio项目文件等。

Make

Make是一个构建自动化工具,最常与Makefile配合使用。Makefile是一种脚本文件,定义了构建项目的规则和依赖关系。Make的工作流程如下:

  1. 读取Makefile:Make工具读取Makefile文件。
  2. 执行规则:Make根据Makefile中定义的规则和依赖关系,自动化地执行编译和链接命令,以生成目标文件(如可执行文件或库)。

Ninja

Ninja也是一个构建系统工具,专注于快速、高效的构建过程。与Make类似,Ninja使用自己的构建文件(通常名为build.ninja)来定义构建规则和依赖关系。Ninja的特点包括:

  1. 高性能:Ninja专为速度优化,能够快速执行并行构建。
  2. 简单的文件格式:Ninja的构建文件格式简单直接,适合自动生成。

CMake、Make和Ninja的关系

  1. CMake与Make和Ninja:CMake是一个更高级别的工具,用于生成Make和Ninja使用的构建文件。用户编写CMakeLists.txt文件,然后使用CMake生成Makefile或Ninja build文件。
  2. Make与Makefile:Make使用Makefile文件来定义构建规则和依赖关系,并执行这些规则以构建项目。
  3. Ninja与build.ninja文件:Ninja使用build.ninja文件来定义构建规则和依赖关系,并执行这些规则以构建项目。

工作流程示例

假设我们有一个简单的C++项目,其中有一个main.cpp文件,我们可以通过CMake生成Makefile或Ninja build文件来构建项目:

  1. 编写CMakeLists.txt文件

    cmake_minimum_required(VERSION 3.10)
    project(MyProject)set(CMAKE_CXX_STANDARD 11)add_executable(MyExecutable main.cpp)
    
  2. 生成Makefile

    mkdir build
    cd build
    cmake -G "Unix Makefiles" ..
    make
    
  3. 生成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、逐层旋转 注意到&#xff0…...

基于FPGA的VGA协议实现

目录 一、VGA简介 二、VGA引脚的定义 三、VGA显示原理: 四、VESA标准下的VGA时序: 五、VGA显示模式以及相关参数: 六、数字信号与模拟信号的转换 实战演练一:VGA显示彩条 1、实验目标 2、各模块框图及其波形图 3、模块代…...

云计算——弹性云计算器(ECS)

弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

GitHub 趋势日报 (2025年06月08日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【Oracle】分区表

个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...