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

如何编写一个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?

  • C语言中,我们使用visual studio开发软件时候,写程序开始时候都会创建一个project项目文件,然后在文件里面编译 .h 和 .c 的文件。

  • 在Linux中,有一个叫make的东西,就相当于C语言的集成开发环境,我们只需要在make里面创建文件,写代码,make会帮我们管理这些文件。

  • 不过我们创建的项目不叫project,而是称为Makefile,打开一个make源程序包,发现很多Makefile的文件,说明里面有很多的项目。

  • 在源程序包里面,也有名为makefile的文件(m是小写),两个命名同时存在,这是合理的,在开发一个项目的时候,工程师一般都会命名为Makefile然后打包交给用户,用户觉得某个Makefile需要改动,用户改动后或者新建后的项目定义为makefile,并且在运行时候,先执行makefile,再执行Makefile文件。

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 查看当前目录下的文件,发现成功创建了5个文件。

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文件的信息写的并不是十分的规范,有的东西还没有写,有的写的太麻烦。接下来逐步完善一下

三、代码优化

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有个较为全面的认识。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139998.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PyCharm激活码永久有效PyCharm2018.1.6激活码教程-持续更新,一步到位「建议收藏」

    PyCharm激活码永久有效PyCharm2018.1.6激活码教程-持续更新,一步到位「建议收藏」PyCharm激活码永久有效2018.1.6激活码教程-Windows版永久激活-持续更新,Idea激活码2018.1.6成功激活

    2022年6月19日
    29
  • iterator迭代器详解_c++迭代器iterator

    iterator迭代器详解_c++迭代器iterator迭代器 Iterator动机模式定义实例结构要点总结笔记动机在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象.我们希望在不暴露其内部结构地同时.可以让外部客户代码透明地访问其中包含地元素;同时这种”透明遍历”也为”同一种算法在多种集合对象上进行操作”提供了可能.使用面向对象技术将这种便利机制抽象为”迭代对象”为”应对变化中地集合对象”提供了一种优雅地方式模式定义提供了一种方法顺序访问一个聚合对象中地各个元素,而又不暴露(稳定)该对象地内部表示.实例结构要点总结迭代抽象

    2022年8月11日
    1
  • java的treemap_java map用法

    java的treemap_java map用法TreeMap简介TreeMap是一个有序的key-value集合,它是通过红黑树实现的。TreeMap继承于AbstractMap,所以它是一个Map,即一个key-value集合。TreeMap实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。TreeMap实现了Cloneable接口,意味着它能被克隆。TreeMap实现了ja…

    2025年5月24日
    0
  • Linux虚拟机重启_linux虚拟机怎么关机

    Linux虚拟机重启_linux虚拟机怎么关机一、Linux的五个重启命令1、shutdown2、poweroff3、init4、reboot5、halt二、五个重启命令的具体说明shutdownreboot在linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本文的介绍,希望你可以更加灵活的运用各种关机命令。1.shutdownsh…

    2022年10月10日
    0
  • linux非root用户启动nginx,Linux 普通用户启动nginx

    linux非root用户启动nginx,Linux 普通用户启动nginx现象nginx配置的user为www用户,root启动之后主进程显示root,子进程显示是www,但是切换到www用户之后执行nginx-t等报错services@pts/0$/usr/local/nginx/sbin/nginx-tnginx:[warn]the”user”directivemakessenseonlyifthemasterprocess…

    2022年9月26日
    0
  • poetry下载_烘手器安装

    poetry下载_烘手器安装介绍Poetry是Python中的依赖管理和打包工具,当然它也可以配置虚拟环境。它允许您声明项目所依赖的库,并为您管理(安装/更新)它们。之前一直使用virtualenvwrapper管理虚拟

    2022年7月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号