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

目录

  • 一、概念理解(彩蛋藏在某个地方)
    • 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 创建makefile
      • 2.2.3 执行makefile文件
      • 2.2.4 查看目录并运行可执行文件
  • 三、代码优化
    • 3.1 添加clean信息
    • 3.2 简化makefile信息
      • 3.2.1 简化第一版
      • 3.2.2 简化第二版
      • 3.2.3 简化第三版
  • 四、总结一下

【针对评论 hj_try_1991 2022.08.08留言,文中个别书写错误已修正(2022/11/15)】

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

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,这里我们修改为mytoolgcc main.o tool1.o tool2.o -o mytoolmain.o:main.c#-Wall 可以看到所有的警告#-g 可以调试#-c 只允许执行到汇编步骤,不允许链接。gcc main.c -c -Wall -g -o main.o
tool1.o:tool1.cgcc tool1.c -c -Wall -g -o tool1.o
tool2.o:tool2.cgcc tool2.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 -gmytool:$(OBJS)$(CC) $(OBJS) -o mytool
main.o:main.c$(CC) main.c $(CFLAGS)  -o main.o
tool1.o:tool1.c$(CC) tool1.c $(CFLAGS) -o tool1.o
tool2.o:tool2.c$(CC) tool2.c $(CFLAGS) -o tool2.oclean:rm *.o mytool -rf

3.2.2 简化第二版

# $^ 代替 上面的指令
# RM 代替 rm -f
# $@ 代替 目标文件OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS=-c -Wall -gmytool:$(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 -gmytool:$(OBJS)$(CC) $^ -o mytool
%.o:%.c$(CC) $^ $(CFLAGS)  -o $@clean:$(RM) *.o mytool -r

四、总结一下

这次从零开始接触makefile,先查阅文本资料简单的接触一下makefile,留下了印象是好难读懂什么意思,痛苦几天后找到和视频资料并且写下了这篇总结,基本上可以对makefile有个较为全面的认识。

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

  1. C语言eigen存为txt文件,如何为使用Eigen(C线性代数的模板库)的C项目编写一个makefile?...

    我正在使用特征库,它承诺矩阵运算的矢量化.我不知道如何使用Eigen中给出的文件并编写一个makefile.使用Eigen的源文件包括下面列出的文件,这些文件甚至不是头文件(它们只是一些文本文件) – ...

  2. 编写html文件不能在哪个软件中编写,html用什么软件编写?使用Dreamweaver8编写一个html文件的方法--系统之家...

    Dreamweaver8是一款集网页制作和管理网站于一身的所见即所得网页编辑器, 很多小伙最近再问Dreamweaver8怎么才能编写html文件?如何使用Dreamweaver8制作一个html文件 ...

  3. python 编写一个局域网文件传输的程序

    可以使用 Python 的 socket 模块来编写一个局域网文件传输程序. 首先,你需要在服务端程序中创建一个 socket 对象,并绑定到特定的 IP 地址和端口上.然后,服务端可以通过调用 so ...

  4. matlab编写正整数阶乘函数,用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值....

    点击查看用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值.具体信息 答:编写一个matlab文件,求1到n的阶乘之和.其代码编写的目的,就是学会自定义 ...

  5. 性能测试: 编写一个 Locust 文件

    Locust文件就是一般的Python文件.唯一的需求就是它至少需要一个继承于Locust的类. Locust类 Locust类代表一个用户(如果愿意,也可以是一个准备出动的蝗虫).Locust会为每 ...

  6. java编写一个框架_手把手教你写一个基于 RxJava 的扩展框架

    背景 现在 RxJava 在 Android 开发中可谓时炽手可热,其受欢迎程度不言而喻,也因此在 github 上出现了一系列的基于 RxJava 的框架,如 RxBinding.RxPermiss ...

  7. 编写完html文件怎么输出,怎么编写一个html文件?在线等!!

    html head meta http-equiv=Content-Type content=text/html; charset=gb2312 title课程表/title style type=t ...

  8. 请编写一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某

  9. 编写Makefile文件

    续GCC编译器 1.编写Makefile UNIX系统上很多软件包都是使用make程序和Makefile文件来实现自动编译的,make程序的目的就是自动确定一个软件包的哪些部分需要重新编译,并用特定的 ...

  10. Makefile文件的编写规则

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...

最新文章

  1. 数字图像处理——第五章 图像复原与重建
  2. Android Wifi 主动扫描 被动扫描
  3. 接地气的数据分析入门与进阶
  4. 2020大学计算机知到答案,2020年_知到_大学计算机(济南大学)_网课答案
  5. 人人网的系统架构 网上搜集
  6. 9_less中的层级结构
  7. java8 自动关闭资源_java9系列第二篇-资源自动关闭的语法增强
  8. IOS判断用邮箱登录验证是不是合法的方法
  9. Notepad++删除空白行
  10. 小米9se开发版系统回刷MIUI稳定版系统
  11. 定理在数学中的简写形式_【数学】「专题」斯图尔特定理(Stewart's Theorem)与中线定理(Pappus Law)...
  12. python里的map是什么意思_python中map什么意思
  13. gcc / -Wl,-Bsymbolic
  14. 删除桌面图标计算机权限删除,Win7系统桌面图标删除不了的处理方法
  15. 内地两例确诊病人尚有44名密切接触者未能寻获
  16. 一种带开关量的开口式电流互感器的应用
  17. 【附源码】Python计算机毕业设计农商行贷款管理系统
  18. python视频行人检测_python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
  19. 人工智能基础实验报告模板
  20. Win7 VS2017编译magnum及例子

热门文章

  1. 高新区 中国智慧城市大数据创新联盟揭牌
  2. html设置表格高宽的代码_设置html表格宽度
  3. nmake编译dll
  4. 如何修改Tomcat默认端口号
  5. mac上超好用的文字转语音工具【迅捷文字转语音】
  6. 正交幅度调制(QAM)
  7. Hustoj mdui Web界面修改
  8. 南方cass快捷键命令修改在哪_南方测绘cass快捷键命令大全,南方测绘cass常用的快捷键命令有哪些?...
  9. 南方cass计算表面积_CASS在工程中的应用“计算表面积”的方法
  10. css一些需要注意的东西