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

article/2025/9/12 16:59:30

在这里插入图片描述

前言

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

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

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

在这里插入图片描述

一、Makefile的显式规则

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

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

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

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

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

举个例子:

hello:hello.ogcc hello.o -o hellohello.o:hello.Sgcc -c hello.S -o hello.ohello.S:hello.igcc -S hello.i -o hello.Shello.i:hello.cgcc -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.htest:program1.o program2.o main.ogcc program1.o program2.o main.o -o testprogram1.o:program1.cgcc -c program1.c -o program1.oprogram2.o:program2.cgcc -c program2.c -o program2.omain.o:main.cgcc -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.oprogram2.o:program2.c$(CC) -c program2.c -o program2.omain.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)

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

在这里插入图片描述


http://chatgpt.dhexx.cn/article/Mj6AkGpE.shtml

相关文章

Makefile的入门完整教程(包学包会)

Makefile的完整入门教程&#xff08;实现不了来打我TAT&#xff09; 看完能够了解Makefile是什么&#xff1b;我们能用makefile做什么&#xff1b;makefile的简易使用 1、什么是Makefile Makefile 可以简单的认为是一个工程文件的编译规则&#xff0c;描述了整个工程的编译和…

Linux makefile 教程 非常详细,且易懂

最近在学习Linux下的C编程&#xff0c;买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊&#xff0c;可能是我的理解能不行。 于是google到了以下这篇文章。通俗易懂。然后把它贴出来&#xff0c;方便学习。 后记&#xff0c;看完发现这篇文章和《Linux环境下的C…

Makefile基础教程

前期准备 在真正使用Makefile之前&#xff0c;我们首先先写四个c文件和相应的h文件&#xff0c;分别是fun0.c,fun1.c,fun2.c,fun0.h,fun1.h,fun2.h以及main.c //fun0.c #include "fun0.h" void print0(){printf("hello world 0"); }//fun0.h #include &l…

Makefile教程(掌握这里足够)

众所周知&#xff0c;在Linux环境下进行项目开发那就少了使用make来构建和管理自己的工程。如果想要更加深入的学习&#xff0c;我在这里推荐一本书 https://www.jianguoyun.com/p/DZWKrLIQjKL5Bxi0z5UD 访问密码&#xff1a;KvhT2v 1. makefile的命名 默认的情况下&#xff…

Makefile 编写教程(由简至难)

目录 一、测试代码二、.c 文件与Makefile同级三、.c文件与Makefile不同级四、链接静态库 一、测试代码 本文以将main.c add.c common.h三个文件编译成一个可执行文件为例&#xff0c;来讲解Makefile的编写。以下是每个文件的代码&#xff08;很简单&#xff0c;测试用&#xf…

好看的vscode字体

vscode下载上面出现的字体(自行百度搜索) (Cascadia Code, 等线)(等线是中文, Cascadia Code是英文, 自认为比较cool的搭配, 也可以自行选择)然后放到C:\Windows\Fonts 会自动安装就完事了~ 欢迎大家关注我的公众号:<前端成长指南> 我会把我的原创作品陆续放在上面

Unity3D中字体样式

字体样式分为三种 系统默认字体 自定义字体&#xff08;包括全部字体&#xff09; 自定义字体&#xff08;不包括全部字体&#xff09;系统默认字体描述优点内存占用小缺点没有艺术效果&#xff0c;没有灵魂 自定义字体&#xff08;包括全部字体&#xff09;描述优点具有一定…

前端HTML字体和文本样式

前端HTML字体和文本样式 文章目录 前端HTML字体和文本样式1.字体样式1.1字体大小1.2 字体粗细1.3 字体样式&#xff08;是否倾斜&#xff09;1.4字体类型1.5 样式层叠问题1.6 字体复合属性 2.文本样式2.1 文本缩进2.2 文本水平对齐方式2.3文本修饰 3.行高 属性表示注意点font-s…

layui表头样式_Layui表格好看样式

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Layui表格好看样式 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术&#xff1a;web 作者&#xff1a;xq 撰写时间&#xff1a;2019.7.27 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

android+字体样式包,android 改变全局字体样式(第三方字体包)

android 改变全局字体样式 参考&#xff1a;http://stackoverflow.com/questions/2711858/is-it-possible-to-set-font-for-entire-application/16883281#16883281 1.将要替换的字体包放到assets下 2.具体代码&#xff1a; //设置新的字体样式 public static void setDefaultFo…

IDEA 修改字体样式

每次发现别人的IDEA字体都是这么好看&#xff0c; 今天这里推荐一款设置方法美化我们IDEA的代码&#xff0c; 代码变漂亮了&#xff0c;写代码也更带劲&#xff01;注意哦这针对的都是windows系统哦&#xff0c;mac系统就不用了&#xff0c;已经很完美了 第一步&#xff1a;下载…

7.20 Web前端-字体样式

今天为大家介绍一下关于字体的相关知识&#xff0c;这里的知识比较简单&#xff0c;因为之前的教学中我们已经接触到了一部分关于字体的知识&#xff0c;在这里我来汇总说一下。 1.长度单位&#xff1a; 长度单位就是你的字体在网页中占用的长度是多少&#xff0c;在web中不是…

9款漂亮的纯css字体样式

样式&#xff1a; 代码&#xff1a; <html> <head> </head> <style>body{text-align: center;}.hcqFont{position:relative;letter-spacing:.07em;font-size:3em;font-weight:normal;margin:0 auto}.hcqFont:before,.hcqFont:after{position:absolut…

7款漂亮的纯css字体样式

简单粗暴&#xff0c;直接上马&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><h1 class"vintage1">美丽的中国语</h1><h1 class"vi…

纯Css比较好看的中英文字体样式(持续整理版)

刚好公司要用到&#xff0c;需要纯css的&#xff0c;不用任何插件就可以显示很不错的字体 样式一&#xff1a; <style type"text/css"> .tb-js-yf-style{font-family: "Arial","Microsoft YaHei","黑体","宋体",san…

Windows 安装 HDF5 C++库

1. 简介 HDF5可以自己从源码编译&#xff0c;也可以通过下载已经编译好的版本的安装包安装。下面介绍的是安装包安装的方式。 2. HDF5安装包下载 地址1&#xff1a; https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.18/bin/windows/ 地址2&#xff1a; h…

HDF5 使用介绍

1、HDF5介绍 HDF 是用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF 是由美国国家超级计算应用中心&#xff08;NCSA&#xff09;创建的&#xff0c;以满足不同群体的科学家在不同工程项目领域之需要。HDF 可以表示出科学数据存储和分布的许多必要条件。HDF 被设计…

hdf5 文件生成 C++

使用 hdf5 配置 1. 包含目录 E:\WorkSpace\SoftWare\hdf5\include 2.库目录 E:\WorkSpace\SoftWare\hdf5\lib\ 3.链接器 -输入 hdf5.lib hdf5_cpp.lib 4. C/C -预处理器定义 H5_BUILT_AS_DYNAMIC_LIB; 注意 使用 hdf5 用于 训练 过程 void dataToMat(vector<Lan…

HDF5 学习总结1

目录 一 HDF5简介 1.1 HDF5背景 1.2 抽象数据模型 1.2.1 File 1.2.2 Group 1.2.3 Dataset 1.2.4. Dataspace 1.2.5. Datatype 1.2.6. Attribute 1.2.7. Property List 1.2.8. Link 一 HDF5简介 1.1 HDF5背景 HDF5:(Hierarchical Data Format)是由美国伊利诺伊大…

HDF5 windows编译 release版本、Debug版本

由于最近急需的一个项目&#xff0c;需要hdf5库&#xff0c;误打误撞&#xff0c;编译成功。特此记录 1、下载源代码 官网下载地址&#xff1a;https://portal.hdfgroup.org/display/support/HDF51.12.2#files 找到如下地址&#xff0c;本人电脑有cmake软件&#xff0c;我下…