首页 >> 大全

一、Makefile基本写法规则

2023-12-18 大全 26 作者:考证青年

目录 三、文件管理 四、小结

我们在Linux中写一个工程,使用来进行工程文件的管理是必不可少的,那么这篇文章就主要来讲一下的一些基本写法

我们以一个简单的工程为例:

这是一个简单的计算器的小工程,我们可以看到有跟多 .c 和 .h 文件,如果我们直接gcc进行编译的话会比较麻烦,这时候我们就需要来进行管理。

一、基本写法规

首先我们要弄明白的作用是什么?

第一是将写好的程序进行编译、链接生成可执行文件;
第二是将各类型的文件进行管理。

所以我们第一步就是要将程序进行编译链接,但在这之前我们需要清除的写法规则:

目标 : 依赖的文件命令

这就是的基本的写法,其中有几条规则:

1、依赖的文件可以没有,命令也可以没有;
2、命令前面的空必须是用tab键敲的,不能使用空格键。
3、'#'后面写注释

在了解了写法之后,就要按照这个写法来进行各个文件的编译和链接,我们将最终的可执行文件命名为main

我们可以看到,绿色的就是目标,黑色的就是依赖的文件,红色的就是命令,main 这个可执行文件所依赖的是所有 .c 文件编译后的 .o 文件,而每个 .o 文件又依赖于 .c 文件,从这我们也可以看出执行的时候是一个递归进行的。

我们可以 make 一下看看:

我们可以看到很明显是一个递归的过程。

当我们再make的时候我们会发现会报一个:

make: `main' is up to data.

这个意思就是自动识别我们是否将源文件进行修改,如果未修改则不会重复执行。

我们这样执行会生成许多的 .o 文件,我们可以在最后加上:

_基本法律法规_旅游政策与法律法规章节写题

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是重新编译

四、小结

以上就是一个的基础的写法,很好的帮助我们进行了工程文件的管理,是一个非常好用的软件,而想写好也是需要费一番功夫的,需要多写多练。本人也是一名Linux初学者,有什么问题欢迎大家留言指正。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了