【Makefile】和【CMake】的区别

Makefile 和 CMake 的区别

MakefileCMake 都是用于构建项目的工具,但它们有一些区别。

Makefile:

  1. 语法: Makefile 使用自己的语法规则,包括规则、目标、依赖等。这是一种特定于 make 工具的语法。

  2. 平台依赖: Makefile 是平台相关的,同一个 Makefile 在不同的操作系统上可能需要进行修改。

  3. 手动维护: 对于大型项目,手动编写和维护 Makefile 可能会变得复杂,特别是在跨平台构建时。

  4. 编译器选项: Makefile 可以直接指定编译器和编译选项。

  5. 直接构建规则: Makefile 本身描述了构建规则,不需要其他工具。

CMake:

  1. 语法: CMake 使用一种更高级的、更简洁的语法,不同于 Makefile。它提供了更抽象的描述项目的方式。

  2. 平台中立: CMake 是平台中立的,可以在不同的操作系统上生成对应的本地构建文件,如 Makefile、Visual Studio 工程等。

  3. 自动生成: CMake 允许用户在一个 CMakeLists.txt 文件中描述项目,然后使用 CMake 工具自动生成相应的构建系统文件。

  4. 多编译器支持: CMake 支持多种编译器,可以在不同的编译器之间进行切换。

  5. 项目组织: CMake 通过目录结构来组织项目,使得项目更加模块化和可维护。

  6. 跨平台: CMake 使得跨平台构建更加容易,同一个 CMakeLists.txt 文件可以生成适用于不同操作系统的构建文件。

综合而言,CMake 提供了更高级、更灵活的项目描述方式,使得跨平台开发和维护更加容易。而 Makefile 更加底层,需要手动编写构建规则,适合简单的项目或对构建过程有严格要求的情况。在实际应用中,很多项目使用 CMake 作为高级构建系统,而在具体的编译时,CMake 会生成对应平台的 Makefile 或其他构建系统的文件。

特点MakefileCMake
语法Makefile语法规则高级且简洁的CMake语法
平台依赖平台相关平台中立
手动维护手动编写和维护可能复杂通过CMakeLists.txt自动生成
编译器选项直接指定编译器和编译选项更抽象,支持多种编译器
构建规则直接描述构建规则高层次描述项目结构和规则
自动生成不支持自动生成构建文件通过CMake工具自动生成构建文件
项目组织较为平坦的结构目录结构化,更模块化
跨平台需要手动处理平台差异支持跨平台构建

Makefile

当编写一个 Makefile 时,需要考虑项目的结构以及源代码和目标文件的分布。下面是一个简单的 Makefile 示例,假设你有一个 C 语言项目,包含两个源文件(main.cfunctions.c)以及一个头文件(functions.h)。

CC = gcc
CFLAGS = -Wall -g# 源文件
SRC_FILES = main.c functions.c# 目标文件
OBJ_FILES = $(SRC_FILES:.c=.o)# 可执行文件
TARGET = myprogram# 默认目标
all: $(TARGET)# 生成可执行文件
$(TARGET): $(OBJ_FILES)$(CC) $(CFLAGS) -o $@ $^# 生成目标文件
%.o: %.c$(CC) $(CFLAGS) -c -o $@ $<# 清理生成的文件
clean:rm -f $(OBJ_FILES) $(TARGET)

这个 Makefile 包括以下部分:

  • CC:编译器(gcc)。
  • CFLAGS:编译器选项,包括警告开启(-Wall)和调试信息开启(-g)。
  • SRC_FILES:源文件列表。
  • OBJ_FILES:目标文件列表,通过将 .c 扩展名替换为 .o 生成。
  • TARGET:最终的可执行文件。
  • all:默认目标,表示执行 make 命令时,默认构建 TARGET
  • $(TARGET):生成可执行文件的规则,依赖于 OBJ_FILES
  • %.o: %.c:生成目标文件的规则,将每个 .c 文件编译成相应的 .o 文件。
  • clean:清理规则,用于删除生成的目标文件和可执行文件。

你可以将这个 Makefile 放在项目的根目录,并通过运行 make 命令来构建项目。如果需要清理生成的文件,可以运行 make clean。请根据你的项目结构和需求进行适当的修改。

CMake

下面是一个简单的CMakeLists.txt的示例,假设你的项目包含一个源文件 main.c:

# 指定CMake的最低版本
cmake_minimum_required(VERSION 3.10)# 为项目命名
project(MyProject)# 添加可执行文件并指定源文件
add_executable(my_executable main.c)

在这个示例中:

  • cmake_minimum_required(VERSION 3.10) 指定了CMake的最低版本要求。
  • project(MyProject) 为项目命名。
  • add_executable(my_executable main.c) 添加了一个可执行文件,并指定了源文件 main.c。

你可以将这个CMakeLists.txt文件放在你的项目根目录,然后使用以下命令在构建目录中生成构建文件:

cmake /path/to/your/project

接着,使用生成的构建系统(如Makefile)来构建你的项目:

make

以上只是一个简单的示例,实际的项目可能涉及更复杂的结构和依赖关系,CMake提供了丰富的功能来处理这些情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript框架】Vue与React中的组件框架概念

组件框架是用于构建应用程序的工具&#xff0c;以便将UI和逻辑划分为单独的可重用组件。目前的组件框架包括React、Vue、Angular、Ember、Svelte等。 Vue和React使用了常见的框架概念&#xff0c;如处理状态、道具、引用、生命周期挂钩、事件等。这两个框架在当今的web开发中被…

案例:某电子产品电商平台借助监控易保障网络正常运行

一、背景介绍 某电子产品电商平台是一家专注于电子产品销售的电商平台&#xff0c;拥有庞大的用户群体和丰富的产品线。随着业务规模的不断扩大&#xff0c;网络设备的数量和复杂性也不断增加&#xff0c;网络故障和性能问题时有发生&#xff0c;给平台的稳定运行带来了很大的挑…

项目中高并发如何处理

在项目中处理高并发主要需要考虑以下几个方面的策略&#xff1a; 优化数据库设计&#xff1a;使用合适的数据结构、索引和查询优化技术可以显著提高数据库的响应性能&#xff1b;分库分表使用缓存&#xff1a;缓存是一种非常有效的处理高并发的方法。通过将常用的数据或结果保…

[原创][第I部分][编程基础]我的C++ 98复习并升级到C++20的复习旅途

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…

python激活python38

py38是我建立的anaconda下的一个python3.8环境。 命令行里使用conda activate py38会出现&#xff1a; conda activate error: argument COMMAND: invalid choice 因为condat已经移除了该命令。 执行 activate py38没报错&#xff0c;但是没有转换到py38环境。 使用 sour…

Spring源码解读之创建bean

本文章我们会解读一下Spring如何根据beanDefinition创建bean的&#xff1b; 代码入口&#xff1a; AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(AppConfig.class);applicationContext.refresh(); 当spring执行refresh(…

关于ai大模型是否开源的讨论

开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。开源让技术共享&#xff0c;吸引了众多人才加入&#xff0c;推动了大模的创新。而闭源则保护了商业利益和技术优势&#xff0c;为大模型的商业应用提供了更好的保障。 一、开源和闭源的…

人工智能学习1

一.人工智能概述 1.AI的基础学科包括&#xff1a;数学&#xff08;离散、模糊&#xff09;、思维科学&#xff08;认知心理、逻辑思维学、形象思维学&#xff09;和计算机&#xff08;硬件、软件&#xff09;等。 2.新一代人工智能呈现出“深度学习、跨界融合、人机协同、群智…

Jmeter+influxdb+grafana监控平台在windows环境的搭建

原理&#xff1a;Jmeter采集的数据存储在infuxdb数据库中&#xff0c;grafana将数据库中的数据在界面上进行展示 一、grafana下载安装 Download Grafana | Grafana Labs 直接选择zip包下载&#xff0c;下载后解压即可&#xff0c;我之前下载过比较老的版本&#xff0c;这里就…

单机多卡训练

参考几个不错的帖子&#xff08;还没来得及整理&#xff09;&#xff1a; 基于pytorch多GPU单机多卡训练实践_多卡训练效果不如单卡-CSDN博客 关于PyTorch单机多卡训练_能用torch.device()实现多卡训练吗-CSDN博客 Pytorch多机多卡分布式训练 - 知乎 (zhihu.com) 当代研究生…

在 The Sandbox 设置总部,SCB 10X 和 T-POP 为 4EVE 元宇宙音乐会揭幕

协作学习为全球粉丝提供了无限的可能性&#xff0c;让他们通过革命性的元宇宙体验沉浸在泰国流行文化中。 作为 SCBX 集团背后的创新力量&#xff0c;SCB 10X 很高兴宣布与 T-POP Incorporation 展开开创性合作&#xff0c;T-POP Incorporation 是泰国流行文化在全球舞台上的领…

【算法】快速选择算法

目录 1.概述2.代码实现2.1.基于简单交换排序2.2.基于堆排序2.3.基于快速排序 3.应用 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 1.概述 &#xff08;1&#xff09;快速选择算法 (Quick Select Algorithm) 是一种用于在无序数组中寻找第 k 小&#xff08;…

鸿蒙开发已成新趋势

随着华为鸿蒙操作系统的快速崭露头角&#xff0c;鸿蒙开发已然成为当前技术领域的热门新趋势。本文将深入探讨鸿蒙开发的重要性和独特优势&#xff0c;并详细介绍一些关键的鸿蒙开发技术和工具&#xff0c;以及它们对开发者个人和整个行业带来的深远影响。 首先&#xff0c;鸿蒙…

入侵redis之准备---VMware安装部署kail镜像服务器【详细包含云盘镜像】

入侵redis之准备—VMware安装部署kail镜像服务器【详细包含云盘镜像】 kail是一个很好玩的操作系统&#xff0c;不多说了哈 下载kail镜像 kail官网:https://www.kali.org/get-kali/#kali-platforms 百度云盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1PRjo…

django框架ORM

1、安装mysqlclient pip install mysqlclient2、创建文件models.py from django.db import modelsclass UserInfo(models.Model):name models.CharField(max_length32)password models.CharField(max_length64)age models.IntegerField(3)3、再settings中注册app INSTALLE…

具身智能17篇创新性论文及代码合集,2023最新

今天来聊聊人工智能领域近期的一个热门研究方向——具身智能。 具身智能&#xff08;Embodied Intelligence&#xff09;指的是机器人或智能体通过感知、理解和交互来适应环境&#xff0c;并执行任务的能力。与传统的基于规则或符号的人工智能不同&#xff0c;具身智能强调将感…

基于springboot实现私人健身与教练预约管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现私人健身与教练预约管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应…

克服海外邮件收发难题,Coremail提供全方位解决方案

客户背景 某3C电子企业成立于2007年&#xff0c;总部位于深圳&#xff0c;公司在国内多个重点城市均设有研发和生产基地。作为一家规模庞大、技术领先的国家高新技术企业&#xff0c;该企业始终致力于锂离子电池的研究与发展&#xff0c;为新能源行业提供专业、系统的材料解决…

hello vtk 圆柱

VTK 可视化的流程及步骤 标题引入VTK库和初始化&#xff1a; 引入 VTK 库和 AutoInit 模块&#xff0c;以便使用 VTK 的渲染和交互功能 设置背景颜色和颜色对象&#xff1a; 使用 vtkNamedColors 设置背景颜色和演员颜色。 创建圆柱体源&#xff1a; 使用 vtkCylinderSou…

蓝桥杯-01简介

文章目录 蓝桥杯简介参考资源蓝桥杯官网第15届大赛章程一、概况&#xff08;一&#xff09;大赛背景和宗旨&#xff08;二&#xff09;大赛特色&#xff08;三&#xff09;大赛项目1.Java软件开发2.C/C程序设计3.Python程序设计4.Web应用开发5.软件测试6.网络安全7.嵌入式设计与…