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、模块代…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
