首先,编写Makefile文件,要明白一些概念。
- 什么是makefile?
很多的windows程序员都不知道这个东西,因为windows的IDE编译环境都打好包做了这个工作了。而在linux下编译自己的程序,学会写Makefile是做为linux程序的基础。
- 程序是怎样编译和连接的?
无论是哪种编译环境下(C\C++\pas),首先都是先把源文件编译成中间代码文件,在windows下是*.obj文件,unix/linux下是*.o,产生这样的*.obj,*.o的过程叫“编译compile”,然后把大量的.obj,.o文件合成一个可执行的文件叫“连接link”。
- Makefile与make的关系?
简单说,make就是Makefile中执行规则的“开关按钮”,在命令行输入make,该文件或目录就会按照Makefile里编写好的规则进行编译和链接程序。
首先我用一个示例来说明Makefile的书写规则,这个示例有8个.C文件,和3个.h头文件,我要写一个Makefile来告诉make命令如何编译和链接这几个文件的。规则如下:
- 如果这个工程没有编译过,那么我们的所有C文件都要被编译和链接。
- 如果这个工程的某几个C文件修改,那么我们只编译被修改的c文件,并链接目标程序。
- 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的c文件,并链接目标程序。
只有我们的Makefile写的够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重新编译,从而自己编译所需要的文件盒连接目标程序。
- Makefile的规则?
target...:prerequisites...
(tab开头)command
...
...
target也就是一个目标文件,可以是.o,也可以是执行文件,还可以是一个标签(Label)。
prerequisites就是要生成那个target所需要的文件或目标。
command也就是make 需要执行的命令。任意的shell命令
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是prerequisites
中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。
- 示例:
正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的
edit:main.o kbd.o command.o display.o\
sert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o