2025年makefile 常规+进阶使用方法(附代码示例)

makefile 常规+进阶使用方法(附代码示例)目录 makefile 是什么 如何使用 makefile makefile 的编写规则 基本格式 示例 联合编译 apple c 和 orange c 进阶 更省时间的编写方法 预定义变量 获取同类型文件指令 替换文件名后缀 make 解释执行规则

大家好,我是讯享网,很高兴认识大家。

目录

makefile是什么: || 如何使用makefile: 

makefile的编写规则:基本格式:示例:联合编译apple.c 和 orange.c

进阶:更省时间的编写方法  || 预定义变量 || 获取同类型文件指令 || 替换文件名后缀

make解释执行规则:


makefile是什么:

makefile是一个文本文件,我们在其中编写项目的构建规则

如何使用makefile:

(以下操作均在mkf文件中进行):

[dev@localhost mkf]$ vim makefile //创建一个makefile文件 [dev@localhost mkf]$ make //使用make命令 

讯享网

输入make命令后,makefile的解释程序开始运行,在当前目录下找到名为makefile的文件,逐行解释执行。

makefile的编写规则:

基本格式

讯享网目标对象 :依赖对象 [tab]为了生成目标对象所需要执行的指令

示例:联合编译apple.c 和 orange.c

首先,在mkf文件下创建两个.c文件

1: apple.c+ ⮂⮂ buffers 1 #include<stdio.h> 2 #include"fruit.h" 3 4 int main() 5 { 6 printf("this is apple.c."); 7 Orange(); 8 return 0; 9 } 
讯享网 1: orange.c 1 #include<stdio.h> 2 #include"fruit.h" 3 4 void Orange(){ 5 printf("this is orange.c\n"); 6 } 

通过fruit.h将两个.c文件联合,使得apple.c可以使用orange.c中的函数

 1: fruit.h 1 extern void Orange(); //声明Orange()为全局函数

 常规方法是使用如下命令,对这几个文件进行编译(注意:不需要加上fruit.h,在编译程序时,编译器会自动在目录下检索名为fruit.h的头文件)


讯享网

 此时,若需要多次编译调试,使用makefile ,可以省区许多写编译代码的时间。

进入makefile:

讯享网 makefile+ main:orange.c apple.c gcc orange.c apple.c -o main 

 目标对象 (main) :依赖对象(orange.c apple.c)
[tab]为了生成目标对象所需要执行的指令(gcc orange.c apple.c -o main)

 这时,使用make指令,就可以和使用“gcc orange.c apple.c -o main”指令达到相同的效果了。

进阶:更省时间的编写方法

预定义变量

有时候,如果我们需要联合编译上百个文件,a.c ,b.c ,c.c ,d.c ,..... ,那么以下粉色字体需要写两遍,若是还要求生成.o文件,则需要花费更多的时间重复做相同的事情。此时,预定义变量可以帮助我们省去许多的时间。

预定义变量格式:     

 $@ 代表目标对象      $^ 代表所有依赖对象      $< 代表依赖对象的第一个    

示例:                                                

      main:orange.c apple.c         gcc orange.c apple.c -o main    

就等价于:

讯享网     main:orange.c apple.c         gcc $^ -o $@ 

获取同类型文件指令

除了预定义变量,还有一个指令值得使用。情景:在当前文件下有许多.c为后缀的文件,需要将他们联合编译。

   SRC=$(wildcard ./*.c)     //代表获取所有.c类型的文件                                                                             main:$(SRC)      gcc $^ -o $@

其中,./代表当前目录,.c表示这类文件


替换文件名后缀

讯享网$(SRC:%.c=%.o)

含义:将SRC变量中所有以.c结尾的文件名替换成对应的以.o结尾的文件名,然后赋回给SRC。

OBJ=$(patsubst %.c, %.o ,$(SRC))

含义:将SRC变量中所有以.c结尾的文件名替换成对应的以.o结尾的文件名,然后赋回给OBJ。

 

make解释执行规则:

1. make生成第一个目标对象之后就会退出

2. 为了生成目标对象,递归先查找依赖对象的生成规则,生成依赖对象之后再去生成目标对象。

示例:

讯享网 apple.o:apple.c gcc -c apple.c -o apple.o orange.o:orange.c gcc -c orange.c -o orange.o main:apple.o orange.o gcc apple.o orange.o -o main 

在这段代码中,我们希望先由apple.c生成apple.o ,再由orange.c生成orange.o ,最后apple.o和orange.o一同生成main,而结果却与之不符:

 可以看出没有生成orange.o,也没有生成main,而原因就是执行规则的第一条,“make”生成第一个目标对象之后就会退出。

所以,我们根据解释执行规则的第二条进行代码的改进:

 main:apple.o orange.o gcc apple.o orange.o -o main apple.o:apple.c gcc -c apple.c -o apple.o orange.o:orange.c gcc -c orange.c -o orange.o 

此时,当编译器想通过apple.o 和 orange.o生成main时,发现并不存在这两个文件,就会递归寻找依赖对象的生成规则,依次生成apple.o和orange.o后,再生成main。

有的同学可能会问,不是生成目标对象就会退出吗?为什么生成apple.o后还会继续执行?注意了:因为是生成第一个目标对象之后,才会退出编译。

小讯
上一篇 2025-01-13 15:41
下一篇 2025-03-26 20:31

相关推荐

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