最实用的Makefile教程 真的很简单(搞不明白网上的教程写那么复杂干嘛)

2023-05-16

在这里插入图片描述

前言

其实我的要求不高,我就是想要写个Makefile,把我那些需要反复编译的文件处理一下就可以了,所以我当时就拼命地在网上找关于Makefile的教程,结果看到的教程都是啰里啰嗦一大堆,看得我云里雾里。

大家要知道,在一些大公司里面,有一个职业是专门写Makefile的,可是我就想用Makefile完成那么一点基础的工作,你给我整那么多乱七八糟的东西干嘛。

在经受网上各种教程的毒打之后,我实在是忍不住了,我自己写一个教程算了。大家看这篇文章的时候,如果你也和我一样,一开始只是想解决最基础的问题,你就只要看第一个章节就可以了,后面的大家视情况而定。

在这里插入图片描述

一、Makefile的显式规则

首先,在Makefile中,#代表着注释,这个是不会被编译进去的。

其次,Makefile的基本语法是:
目标文件:依赖文件
[TAB]指令

大家注意,在Makefile里,有一个很反人类的规定,指令前必须打一个[Tab]键,按四下空格会报错。

越是接近目标文件的命令,就越是要写在前面。因为程序是按照递归的方式进行依赖文件查找的,看到第一行有一个没见过的依赖文件,就往下一行进行查找,以此类推。

但是有些同学反映,不按照这个顺序来写好像也不会报错,我觉得这可能是和版本有关系,不过保险起见,我建议大家还是按照规范来写Makefile。

举个例子:

hello:hello.o
	gcc hello.o -o hello
	
hello.o:hello.S
	gcc -c hello.S -o hello.o
	
hello.S:hello.i
	gcc -S hello.i -o hello.S
	
hello.i:hello.c
	gcc -E hello.c -o hello.i

假设当前文件夹中有hello.c和Makefile两个文件,当我们在终端输入make指令的时候,就会自动编译出hello.o,hello.S,hello.i以及hello可执行文件。

可是,我们又不想要这些不相关的文件,想对这些文件做一些操作,我们把这样的操作叫做伪目标,标志位.PHONY:

在上述代码的最后面加上:

.PHONY:
clear:
	rm hello.o hello.S hello.i

.PHONY:这是固定格式,不能变的,但是下面的clear是自己取的名字,你随便取什么名字都可以,但是clear比较直观。

这样,当我们执行make clear指令后,将只剩下hello.c 和 hello可执行文件。

再来个复杂一点的例子:

# 目标文件:test
# 现有文件:program1.c program1.h program2.c program2.h main.c main.h

test:program1.o program2.o main.o
	gcc program1.o program2.o main.o -o test

program1.o:program1.c
	gcc -c program1.c -o program1.o

program2.o:program2.c
	gcc -c program2.c -o program2.o

main.o:main.c
	gcc -c main.c -o main.o

.PHONY:
clean_all:
	rm program1.o program2.o main.o

到这里,Makefile就学会了,就可以用来做事情了,就是这么简单。

后面的内容无所谓你看不看了,放学了。。。
在这里插入图片描述

二、变量

符号含义
=替换
+=追加
:=恒等于

如果我们写TAR = test,就表示下面的代码中,我们可以用TAR代表test文件。
如果再写TAR += test1,就表示TAR代表test和test1。

CC := gcc 就表示下面写gcc的地方全部可以用CC代替,因为gcc这个是不会变的,是常量,所以可以用恒等于替换,这个不能用+=。

当我们要调用这些变量的时候,就直接使用$(变量)的方式进行调用。

举个例子,对比上面那一段代码,可以修改成下面的样子:

TAR = test
OBJ = program1.o program2.o main.o
CC := gcc

$(TAR):$(OBJ)
	$(CC) $(OBJ) -o $(TAR)

program1.o:program1.c
	$(CC) -c program1.c -o program1.o

program2.o:program2.c
	$(CC) -c program2.c -o program2.o

main.o:main.c
	$(CC) -c main.c -o mian.o

.PHONY:
clean_all:
	rm $(OBJ)

在这里插入图片描述

三、隐含规则

符号含义
%.o任意的.o文件
*.o所有的.o文件

于是,我们又可以把上面的代码简化一下:

TAR = test
OBJ = program1.o program2.o main.o
CC := gcc

$(TAR):$(OBJ)
	$(CC) $(OBJ) -o $(TAR)

%.o:%.c
	$(CC) -c %.c -o %.o

.PHONY:
clean_all:
	rm $(OBJ)

在这里插入图片描述

四、通配符

符号含义
$^所有依赖文件
$@所有目标文件
$<所有依赖文件的第一个文件

所以,上诉代码还可以简化成下面这个样子:

TAR = test
OBJ = program1.o cube.o main.o
CC := gcc
RMRF := rm 

$(TAR):$(OBJ)
	$(CC) $^ -o $@
%.o:%.c
	$(CC) -c $^ -o $@

.PHONY:
cleanall:
	$(RMRF) $(OBJ)

嗯,基本上我一下子就想到这么多了。

在这里插入图片描述

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

最实用的Makefile教程 真的很简单(搞不明白网上的教程写那么复杂干嘛) 的相关文章

  • 向日葵被控服务异常 暂时无法控制问题解决

    特征 xff1a 向日葵图标灰色 xff0c 无识别码和验证码显示 xff0c 左下角黄色显示 xff0c 点击后向日葵被控服务异常 暂时无法控制问题解决 xff0c 开机启动中无向日葵 原因 xff1a 该向日葵版本过旧 xff0c 但是
  • 编译安装ORB-SLAM2获得三维点云地图(搜遍全网,就这一篇能看懂)

    高翔博士对ORBSLAM2修改增加了点云模块 xff0c https github com gaoxiang12 ORBSLAM2 with pointcloud map 在编译过程中 xff0c 遇到很多问题 xff0c 特来记录一下 以
  • SLAM技术目前主要应用在哪些领域

    当今科技发展速度飞快 xff0c 想让用户在AR VR 机器人 无人机 无人驾驶领域体验加强 xff0c 还是需要更多前沿技术做支持 xff0c SLAM就是其中之一 实际上 xff0c 有人就曾打比方 xff0c 若是手机离开了WIFI和
  • Intel Realsense D435i驱动安装及固件升级

    前言 实验室购买了intel realsense d435i RGBD相机 xff0c 用于无人机平台上的定位导航 xff0c 最近新购买了intel nuc xff0c 需要重新布置相机驱动 xff0c 特此把安装经历重新梳理一遍 xff
  • PixHawk飞控和Mission Planner地面站安装调试

    常用地面站软件主要有QGroundControl和MissionPlanner两种 下面以mission planner来介绍如何使用地面站软件进行固件升级和传感器校准 一 PixHawk飞控配置 www pixhawk com PixHa
  • PX4&GAAS

    PX4源码 xff1a https github com PX4 Firmware QGroundControl安装教程 xff1a https docs qgroundcontrol com en getting started down
  • MSCKF那些事-知乎转载

    MSCKF那些事 xff08 一 xff09 MSCKF算法简介MSCKF那些事 xff08 二 xff09 S MSCKF试用与源码解析MSCKF那些事 xff08 三 xff09 算法详解1 xff1a 前端特征跟踪MSCKF那些事 x
  • 赶快入手12代酷睿,畅享性能飞升体验-Acer掠夺者战斧300笔记本评测

    在这个社会全面数字化转型的时代 xff0c 人们对于计算机算力的需求越来越大 xff0c 对于日常使用的主力办公笔记本也是要求越来越全面 xff0c 尤其像笔者这样的编程一族 xff0c 今年一季度酷睿12代系列处理器的推出 xff0c 堪
  • 视觉惯性里程计VIO综述

    参考 xff1a https blog csdn net xiaoxiaowenqiang article details 81192045 目前主流的VIO开源方案主要有以下几类 xff0c 按照相机与IMU的耦合方式可分为松耦合和紧耦合
  • 常用地图结构和基础知识

    1 Occupancy grid map 占用栅格图 最稠密 每隔一个距离就要进行切分 xff08 当每个格子切的比较小也就是分辨率比较大的时候 xff0c 内存非常大 xff09 结构化坐标索引查询 xff0c O 1 https git
  • 2022年度盘点:十大最佳开源SLAM算法

    激光雷达里程计 香港大学开源激光雷达惯性视觉里程计FAST LIVO 论文名 xff1a FAST LIVO Fast and Tightly coupled Sparse Direct LiDAR Inertial Visual Odom
  • STL标准模版库之算法(algorithm)

    STL xff08 Standard Template Library xff0c 标准模板库 是惠普实验室开发的一系列软件的统称 它是由Alexander Stepanov Meng Lee和David R Musser在惠普实验室工作时
  • 树苺派TF卡备份/还原镜像

    树苺派TF卡备份 还原镜像 TF卡备份TF卡还原 备份和还原树莓派TF卡镜像推荐在Linux下进行 TF卡备份 在Ubuntu下插入装有Raspbian的TF卡会直接挂载 xff0c 挂载后的盘在 dev下显示为 34 dev sdx 34
  • 通过dockerfile 创建镜像以及更新镜像

    制作Docker镜像 1 安装 Docker Docker 要求 CentOS 系统的内核版本高于 3 10 查看当前系统的版本 uname r 安装 Docker 软件包和依赖包 yum y install docker 安装完成 从远程
  • RT-Thread 线程同步及通信 -- 信号量、互斥量、事件、邮箱、消息队列

    目录 一 RT Thread 信号量 二 RT Thread 互斥量 三 RT Thread 事件标志组 四 RT Thread 邮箱 五 RT Thread 消息队列 一 RT Thread 信号量 1 信号量相关函数 创建信号量 64
  • Fiddler抓不到浏览器包的常见原因

    代理未设置成功 fiddler 之所以能抓包 xff0c 本质上是因为浏览器 App 软件设置了代理为 fiddler 一旦遇到抓不到包的情况 xff0c 首先应排查浏览器代理是否设置正确 以 Chrome 为例 xff0c 代理设置为 x
  • 经典 SQL 数据库笔试题及答案整理

    马上又是金三银四啦 xff0c 有蛮多小伙伴在跳槽找工作 xff0c 但对于年限稍短的软件测试工程师 xff0c 难免会需要进行笔试 xff0c 而在笔试中 xff0c 基本都会碰到一道关于数据库的大题 xff0c 今天这篇文章呢 xff0
  • 软件测试项目实战(web+app+h5+小程序)

    没有实战经验 xff0c 简历不好编写 xff0c 而且也不好就业 今天给大家分享一个非常适合练手的软件测试项目 xff0c 此项目涵盖web端 app端 h5端 小程序端 xff0c 可以说非常之全面 获取方式在文末 项目介绍 项目名 x
  • 基础软件照搬开源不可取,自力更生才是正途

    最近有关开源软件的话题始终牢牢占据着IT界的新闻头条 xff0c Log4j开源软件的惊天漏洞 Fake js的作者也惊天删库跑路了 xff0c CurL的作者怒怼苹果只会白嫖开源却不出力 xff0c Linux的祖师爷Linus也不知所云
  • ADB 命令知多少?详细 ADB 命令大全来啦

    一 ADB 简介 1 什么是 ADB ADB 全称为 Android Debug Bridge xff0c 起到调试桥的作用 xff0c 是一个客户端 服务器端程序 其中客户端是用来操作的电脑 xff0c 服务端是 Android 设备 A

随机推荐