皇冠新体育APP

IT技术之家

如何编写一个Makefile文件(手把手的教你)_Wyatt_zhai_makefile文件编写

公布用时:2023-08-22 22:37:38 Java 5次 标签:linux 皇冠新体育APP:makefile
目录一、概念理解1、什么是Makefile?2、为何使用Makefile?二、实战代码演示与讲解1 没有makefile的项目是怎么创建运行的1.1 创建文件1.2 查看创建的文件1.3 给创建的文件放一点内容1.4 编译运行2、有makefile的项目如何创建运行2.1 删掉自动生成的a.out文件2.2 创建makefile2.3 执行makefile文件2.4 查看目录并运行可执行文件三、代码优化3.1 添加clean信息3.2 简化makefile信息3.2.1 简化第一版3.2.2 简化第二版3...

如果有帮助,希望点赞支持,我会更有创作的动力哦

目录

一、概念理解(彩蛋藏在某个地方)1.1 什么是Makefile?1.2 为何使用Makefile? 二、实战代码演示与讲解2.1 没有makefile的项目是怎么创建运行的2.1.1 创建文件2.1.2 查看创建的文件2.1.3 给创建的文件放一点内容2.1.4 编译运行 2.2 有makefile的项目如何创建运行2.2.1 删掉自动生成的a.out文件2.2.2 创建makefile2.2.3 执行makefile文件2.2.4 查看目录并运行可执行文件 三、代码优化3.1 添加clean信息3.2 简化makefile信息3.2.1 简化第一版3.2.2 简化第二版3.2.3 简化第三版 四、总结一下

一、概念理解(彩蛋藏在某个地方)

1.1 什么是Makefile?

C话述中,我们大家食用visual studio开发管理游戏之后,写应用程序进行之后都在使用两个project大型项目材料,但是在材料里边儿编译 .h 和 .c 的材料。 在Linux中,有一两个个叫make的事物,就比较于C话述的集成化开放学习环境,我们公司只需要在make里边创立了文件目录名称,写代碼,make会带我们公司管理系统这个文件目录名称。 只有我们大家搭建的投资活动不叫project,是称是Makefile,打開一家make源环节包,发现了不少Makefile的文书,说这里有不少的投资活动。 在源程序代码包内面,有着 名字叫做makefile的zip信息(m是小写字母),两大命名大全规则同时存在着,那就是有效的,在的开发一名新项目流程的当时,新项目 师普遍就会命名大全规则字叫做Makefile第二步废品回收站教给客户,客户觉着其他Makefile想要涂改,客户涂改后还有新砌后的新项目流程设定为makefile,因此在实行当时,先实行makefile,再实行Makefilezip信息。

1.2 为何使用Makefile?

上面提到需要将我们写的大量项目文件管理起来,这里具体讲讲:
这个树形图展示了一个项目中的层级关系,如果我们需要变动3号文件,会发现,牵一发而动全身,改动一个被迫需要改动一堆,为了解放我们,make中编写Makefile就不再需要考虑这些,你把每个文件的依赖关系以指令的形式说明清楚并且保存下来,改动一个即可,会自动帮你修改关联到的其他文件。

二、实战代码演示与讲解

2.1 没有makefile的项目是怎么创建运行的

2.1.1 创建文件

touch main.c tool1.c tool1.h  tool2.c tool2.h 

使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件"file",输入如下命令:
$ touch file #创建一个名为“file”的新的空白文件**

2.1.2 查看创建的文件

要有非常实用的程序设计陋习,创立过后后续看看看时期创立出色
ls

ls 手机查看当下名录下的档案,遇到成功的 使用了2个档案。

2.1.3 给创建的文件放一点内容

vim * -p

vim就是进入文本编辑的命令,按键 i 进入编辑模式,Esc退出编辑模式,:wq 保存退出到终端界面

"tool1.h"

#ifndef TOOL1_H__
#define TOOL1_H__
# 声明函数
void mytoo1(void); 

#endif
"tool1.c"

#include <stdio.h>
#incldue "tool1.h"
# 定义函数
void mytool1(void)
{
	printf("tool1 print\n");
}


只需要稍微修改一下 tool2.h 和 tool2.c 的文件就好啦。

"tool2.h"

#ifndef TOOL2_H__
#define TOOL2_H__
# 声明函数
void mytoo2(void); 

#endif
"tool1.c"

#include <stdio.h>
#incldue "tool2.h"
# 定义函数
void mytool2(void)
{
	printf("tool2 print\n");
}

到现在还只有个主变量main了,测验编码以下几点
#include <stdio.h>
#include "tool1.h"
#include "tool2.h"

int main(){

	mytool1();
	mytool2();
	
return 0;
}
:wa隐退我们方法(保护一切打开微信的资料)

2.1.4 编译运行

2.2 有makefile的项目如何创建运行

makeile教学视频
讲前小科普:

2.2.1 删掉自动生成的a.out文件

rm a.out

2.2.2 创建makefile

vim进入编辑模式,系统检测没有名为makefile的文件,会自动创建。
如果自己想自定义一个其他名字,比如makefilebuff-demo,可能在make操作时候会有影响。下面会讲。

接下来的写依赖关系的时候,你可能会疑惑gcc命令的一些参数,nb我已经预判到了,我的这篇文章可以帮你解决一小部分疑惑
Linux——gcc -c -o 等参数的解释.

# 自定义依赖关系,源文件(后缀为.c)经过编译汇编生成目标文件(后缀为.o)
# 目标文件执行生成可执行文件(类似与mytool)
mytool:main.o tool1.o tool2.o
	# 写gcc命令时候,前面要tab按键一下
	# 不写-o参数,生成默认的可执行文件名为a.out,这里我们修改为mytool
	gcc main.o tool1.o tool2.0 -o mytool

main.o:main.c
	#-Wall 可以看到所有的警告
	#-g 可以调试
	#-c 只允许执行到汇编步骤,不允许链接。
	gcc main.c -c -Wall -g -o main.o
tool1.o:tool1.c
	gcc main.c -c -Wall -g -o tool1.o
tool2.o:tool2.c
	gcc main.c -c -Wall -g -o tool2.o


保存退出,然后查看一下目录(好习惯),发现有一个makefile的文件啦。

2.2.3 执行makefile文件

直接使用make命令

科普:如果你的文件名字不是makefile,而是makefilebuff-demo这样自定义的,那么需要这么操作
make -f makefilebuff-demo
make 命令提示符能否利用 -f 继续执行安全使用的makefile。 若是在如果没有施用 -f 所选的情形下,会都按照下的按序完成。 GNUmakefile, makefile 和 Makefile

2.2.4 查看目录并运行可执行文件

可以看到可执行文件已经是其他颜色了,颜色不同代表这文件权限不同。
(./文件名)运行!

第一阶段就可以完结撒花啦!!!!!


预期上,在这里的makefile文本的消息写的并非是10分的规范起来,有的東西一直并没有有写,有的写的太费事。反驳来日趋全面一番

三、代码优化

3.1 添加clean信息

_实际上,正如上面介绍的流程我们已经基本处理完了项目,这个时候我修改了某文件代码保存退出后,就需要重新的执行make指令,但是跟第一次不同的是,这次make指令执行后界面如图,不再展示依赖和被依赖关系。

_但你们或者我希望总是 制定make,都展出一个依赖相互影响性和被依赖相互影响性相互影响,必须要使用 clean 相关信息
clean:
	# rm 删除指令,删除所有后缀为.o文件,删除mytool这个可执行文件
	# -rf 强制删除并且递归删除,否则的话会一直询问我们是否需要删除
	rm *.o mytool -rf


执行make clean,发现出现了依赖和被依赖的关系

3.2 简化makefile信息

3.2.1 简化第一版

# OBJS   代替  依赖文件
# CC     代替  gcc
# CFLAGS 代替  编译命令

OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS=-c -Wall -g

mytool:$(OBJS)
	$(CC) $(OBJS) -o mytool
main.o:main.c
	$(CC) main.c $(CFLAGS)  -o main.o
tool1.o:tool1.c
	$(CC) main.c $(CFLAGS) -o tool1.o
tool2.o:tool2.c
	$(CC) main.c $(CFLAGS) -o tool2.o

clean:
	rm *.o mytool -rf

3.2.2 简化第二版

# $^ 代替 上面的指令
# RM 代替 rm -f
# $@ 代替 目标文件

OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS=-c -Wall -g

mytool:$(OBJS)
	$(CC) $^ -o mytool
main.o:main.c
	$(CC) $^ $(CFLAGS)  -o $@
tool1.o:tool1.c
	$(CC) $^ $(CFLAGS) -o $@
tool2.o:tool2.c
	$(CC) $^ $(CFLAGS) -o $@

clean:
	$(RM) *.o mytool -r

这个 $(RM) 运行下来可以看到,替代了 rm和 -f

3.2.3 简化第三版

# 6-11行代码相似性很强,可以提取出一个公式模版
#      %.o:%.c
#	       $(CC) $^ $(CFLAGS)  -o $@
# 百分号相当于一个通配符

OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS=-c -Wall -g

mytool:$(OBJS)
	$(CC) $^ -o mytool
%.o:%.c
	$(CC) $^ $(CFLAGS)  -o $@

clean:
	$(RM) *.o mytool -r

四、总结一下

在这里从零开启接触性的面积makefile,先查询文章材质简略的接触性的面积说一下makefile,遗留下了想象是太难了了解之类义思,麻烦几十四天寻找到小视频播放材质但会写写了这篇总结报告,最大多数就能够对makefile带个相对比较周到的认清。