Makefile文件编写详解
2012-06-09 17:20
309 查看
在Linux下编写小程序时,相信大家都知道怎么做,直接编辑源文件(一般是.c和.cpp),然后采用gcc/g++来编译源文件,生成执行文件,这样一个简单的应用程序就可以编写完成。但是如果对于一个复杂应用程序的时候(包含很多源文件和头文件),如果继续采用“编辑-编译-测试”的方式,则需要操作很多次,且只要其中某一个文件改动,其关联到的文件都要重新编译生成。因此,如果继续采用单步编译的方式,则会浪费很多时间且有时候造成混乱(文件太多,不知道哪些被改动,哪些没有,特别是同一个项目由不同的人来维护的时候,问题更为突出)。那么怎么样才能做到高效的吧编写复杂应用程序呢?
这就需要用到makefile文件了和make命令了。
makefile文件主要由一组依赖关系和规则构成。每个依赖关系由一个目标(即要创建的文件:可执行文件或库文件)和一组该目标所依赖的源文件组成,规则描述了如何通过这些依赖文件创建目标。下面以一个具体例子来分析,应用程序由以下几个文件组成:
main.c (输入两个数,打印加减乘除结果)、add_test.c(实现加法操作)、 sub_test.c(实现减法操作)、multiply_test.c (实现乘法操作)、div_test.c(实现除法操作) 和 Compro.h(定义加减乘除函数)。(代码这里就不贴了,因为不是重点)。
我们假定要生成的可执行文件即目标文件为:myapp
则makefile文件编写如下:
![](http://my.csdn.net/uploads/201206/09/1339226198_5464.png)
红框表示的为依赖关系,即生成的目标文件(:左边文件)依赖的文件(:右边文件)。而蓝框表示的规则,即怎么生成目标文件。这里主要采用的gcc编译器。
编写好makefile文件后,就可以通过make命令来执行makefile文件了,直接在上上述所在文件的目录下执行make命令即可,当然如果你不是以makefile命名的话,比如你以aaa (当然这种命名方式也很差劲饿)命名,则可以执行 make -f aaa命令。这里建议大家最好是采用Makefile命名方式(这种命名方式是可以直接在所在文件目录下找到Makefile文件,因为源文件和头文件都是以小写字母命名的)。执行完make命令后,看看生成的文件:
![](http://my.csdn.net/uploads/201206/09/1339226826_2674.png)
myapp就是最终生成的程序可执行文件了,现在执行./myapp来运行下程序:
![](http://my.csdn.net/uploads/201206/09/1339226986_1935.png)
到这里基本makefile文件即make操作就介绍完了,不过大家有没有发现一个问题,虽然这个文件包含的源文件还不算少,但是源文件都是放在一块的。特别是,c和.h文件放在一起,而一般中大型项目都包含很多模块,并且.h和.c文件都是分别放在src和include目录下,因此上面的程序还是没有涉及到把源文件分类和把中大型模块化,而只是吧源文件放置在同一目录下,这样结构极不清晰,也不方便维护。下面讨论下怎么实现模块化的makefile文件编写:
针对上面的应用程序,可以将.c文件存放在/src目录下,.h文件存放在/include目录下,然后在/目录下编写makefile文件,具体实现如下:
![](http://my.csdn.net/uploads/201206/09/1339227737_3665.png)
其中 (1):红框为定义的宏。
(2):蓝框表示的生成中间文件.o的部分,这里涉及到一些foreach函数,一些特许宏的定义比如 $< $@等
其中:foreach函数,$(foreach,<var>,<list>,<text>),表示把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每次<text>会返回一个字符串,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔),将会是foreach函数的返回值。
$< 表示当前依赖文件的名字 ,$@ 表示当前目标文件名字。
$(SRC_DIR)/%.o 表示$(SRC_DIR)目录下即.c文件所在目录/src下,所有.o目标文件,$(SRC_DIR)/%.c 即/src目录下所有.c文件,其中.o和.c文件是一一对应的。
(3):黑框表示的最终生成的可执行文件也就是$(TARGET) = compro_test了。
到此,makefile基本讲完。
这就需要用到makefile文件了和make命令了。
makefile文件主要由一组依赖关系和规则构成。每个依赖关系由一个目标(即要创建的文件:可执行文件或库文件)和一组该目标所依赖的源文件组成,规则描述了如何通过这些依赖文件创建目标。下面以一个具体例子来分析,应用程序由以下几个文件组成:
main.c (输入两个数,打印加减乘除结果)、add_test.c(实现加法操作)、 sub_test.c(实现减法操作)、multiply_test.c (实现乘法操作)、div_test.c(实现除法操作) 和 Compro.h(定义加减乘除函数)。(代码这里就不贴了,因为不是重点)。
我们假定要生成的可执行文件即目标文件为:myapp
则makefile文件编写如下:
![](http://my.csdn.net/uploads/201206/09/1339226198_5464.png)
红框表示的为依赖关系,即生成的目标文件(:左边文件)依赖的文件(:右边文件)。而蓝框表示的规则,即怎么生成目标文件。这里主要采用的gcc编译器。
编写好makefile文件后,就可以通过make命令来执行makefile文件了,直接在上上述所在文件的目录下执行make命令即可,当然如果你不是以makefile命名的话,比如你以aaa (当然这种命名方式也很差劲饿)命名,则可以执行 make -f aaa命令。这里建议大家最好是采用Makefile命名方式(这种命名方式是可以直接在所在文件目录下找到Makefile文件,因为源文件和头文件都是以小写字母命名的)。执行完make命令后,看看生成的文件:
![](http://my.csdn.net/uploads/201206/09/1339226826_2674.png)
myapp就是最终生成的程序可执行文件了,现在执行./myapp来运行下程序:
![](http://my.csdn.net/uploads/201206/09/1339226986_1935.png)
到这里基本makefile文件即make操作就介绍完了,不过大家有没有发现一个问题,虽然这个文件包含的源文件还不算少,但是源文件都是放在一块的。特别是,c和.h文件放在一起,而一般中大型项目都包含很多模块,并且.h和.c文件都是分别放在src和include目录下,因此上面的程序还是没有涉及到把源文件分类和把中大型模块化,而只是吧源文件放置在同一目录下,这样结构极不清晰,也不方便维护。下面讨论下怎么实现模块化的makefile文件编写:
针对上面的应用程序,可以将.c文件存放在/src目录下,.h文件存放在/include目录下,然后在/目录下编写makefile文件,具体实现如下:
![](http://my.csdn.net/uploads/201206/09/1339227737_3665.png)
其中 (1):红框为定义的宏。
(2):蓝框表示的生成中间文件.o的部分,这里涉及到一些foreach函数,一些特许宏的定义比如 $< $@等
其中:foreach函数,$(foreach,<var>,<list>,<text>),表示把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每次<text>会返回一个字符串,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔),将会是foreach函数的返回值。
$< 表示当前依赖文件的名字 ,$@ 表示当前目标文件名字。
$(SRC_DIR)/%.o 表示$(SRC_DIR)目录下即.c文件所在目录/src下,所有.o目标文件,$(SRC_DIR)/%.c 即/src目录下所有.c文件,其中.o和.c文件是一一对应的。
(3):黑框表示的最终生成的可执行文件也就是$(TARGET) = compro_test了。
到此,makefile基本讲完。
相关文章推荐
- Linux平台Makefile文件的编写基础篇和GCC参数详解
- makefile文件编写详解
- makefile 文件中 `cat /lib/sysliblist` 意思详解
- Makefile文件编写
- 多文件、多目录的Makefile的编写
- makefile文件详解--make的运行
- Linux平台Makefile文件的编写基础篇
- makefile文件的编写
- Linux平台Makefile文件的编写基础篇
- Linux平台Makefile文件的编写基础篇
- makefile 进阶--可以用于实际嵌入式工程中的文件编写1
- makefile 进阶--可以用于实际嵌入式工程中的文件编写2目录引入
- 编写makefile文件规则
- makefile和source文件的编写
- 从简入难makefile文件编写,Linux C++编程,简单vi命令
- 静态、动态库的创建使用与makefile配置文件的编写
- 编写Makefile文件中遇到的一个问题
- 多个*.c文件编译生成一个模块驱动*.ko的makefile文件编写
- Makefile文件的编写
- linux 下C语言编程库文件处理与Makefile编写