一、Makefile基本写法规则

目录三、文件管理 四、小结
我们在Linux中写一个工程,使用来进行工程文件的管理是必不可少的,那么这篇文章就主要来讲一下的一些基本写法 。
我们以一个简单的工程为例:
这是一个简单的计算器的小工程,我们可以看到有跟多 .c 和 .h 文件,如果我们直接gcc进行编译的话会比较麻烦,这时候我们就需要来进行管理 。
一、基本写法规则
首先我们要弄明白的作用是什么?
第一是将写好的程序进行编译、链接生成可执行文件;第二是将各类型的文件进行管理 。
所以我们第一步就是要将程序进行编译链接,但在这之前我们需要清除的写法规则:
目标 : 依赖的文件命令
这就是的基本的写法,其中有几条规则:
1、依赖的文件可以没有,命令也可以没有;2、命令前面的空必须是用tab键敲的,不能使用空格键 。3、'#'后面写注释
在了解了写法之后,就要按照这个写法来进行各个文件的编译和链接,我们将最终的可执行文件命名为main
我们可以看到,绿色的就是目标,黑色的就是依赖的文件,红色的就是命令,main 这个可执行文件所依赖的是所有 .c 文件编译后的 .o 文件,而每个 .o 文件又依赖于 .c 文件,从这我们也可以看出执行的时候是一个递归进行的 。
我们可以 make 一下看看:
我们可以看到很明显是一个递归的过程 。
当我们再make的时候我们会发现会报一个:
make: `main' is up to data.
这个意思就是自动识别我们是否将源文件进行修改,如果未修改则不会重复执行 。
我们这样执行会生成许多的 .o 文件,我们可以在最后加上:

一、Makefile基本写法规则

文章插图
clean : rm -rf *.o
这样执行结束后会自动将所有的 .o 文件删掉,但是这就带来了一个问题,那就是如果这个目录下本来就有一个名字叫 clean 的文件,那么就不会执行了,如何解决这个问题呢?很简单,在最前面加上:
.PHONT: clean
就可以了,这样无论是否有重的都会执行,也可以在后面加上 main ,让总是执行 。
二、变量及函数
当然以上并不是我们最终写法,我们可以发现如果按照这样写会很麻烦,所以为我们提供了类似编程语言的变量、函数以及相应的简化字符等非常方便的操作
(一)简化字符
提供了一下几个简化字符:
1、$@ :表示目标2、$^ :表示所有依赖的文件3、$< :表示第一个依赖的文件4、% :通配符,表示所有的.c .o文件,也可以写作“$*”
(二)变量
为了更方便一些,给我们提供了同编程语言一样的变量;
比如我们现在使用的是 gcc 可能之后会变成 g++ 或是别的编译器,那么久可以用变量来代替;
还有我们在写的时候需要照抄一大堆的文件名,我们也可以定义一个变量来简化 。
变量的写法规则:
变量名=变量
使用规则:
$(变量名)
(三)函数
经过上面的变换,我们已经得到了很简便的形式了,但是所有的文件名还需要我们手打,不仅麻烦而且可能会出错,这是又为我们提供了函数 。
函数的使用规则:
$(函数名参数) (可以有多个参数,中间用逗号隔开)
这里需要注意一个问题,在第二个红色框内“$(SRCS:.c=.o)”这句中,冒号和逗号中间一定不能有空格,否则的话路径就会有问题!
三、文件管理 (一)将所有的.o文件放到obj目录中
我们实际上在进行管理的时候是肯定不能将所有的.o文件删掉的,又不能和其他文件放在一起,那样会显得比较乱,所以我们可以将所有的.o文件统一放到obj目录下 。
主要的步骤有四步:
1、获取当前目录路径2、在当前路径下获取到obj目录3、创建4、将所有.o文件放到obj目录下
通过这四部走,我们就可以将.o文件进行管理 。
(二)所有文件管理
当然了,在实际开发中,我们最终要得到的是这样一个结果:
即所有的 .h 文件放到中,所有的 .c 文件放到 src 中,所有的 .o 文件放到 obj 中,最后一个文件在外面,这样才是一个好的文件管理 。
最终我们呈现的是:
(三)补充
最后我们来看一下我们最终版的 。
其中有一些小的技巧
1、notdir这个函数的意思是:只取完整路径的文件名2、-I $(BASEDIR)/include这是包含了头文件的位置3、all 这是为了在有多个项目的时候可以按顺序进行生成可执行文件4、最后的rebuild是重新编译
四、小结
【一、Makefile基本写法规则】以上就是一个的基础的写法,很好的帮助我们进行了工程文件的管理,是一个非常好用的软件,而想写好也是需要费一番功夫的,需要多写多练 。本人也是一名Linux初学者,有什么问题欢迎大家留言指正 。