在Linux中,使用make来维护程序模块关系和生成可执行成需的工具,它可以根据程序模块的修改强狂重新编译链接生成中间代码或最终的可执行程序,执行make命令,需要一个名为Makefile的文本文件,这个文件定义了整个项目的编译规则,包括模块间的依赖关系、文件的编译顺序、以及编译所使用的命令。通过make命令及Makefile文件,整个项目的源程序文件可以自动编译,极大的提高了软件开发效率。

make从Makefile文件获取模块间的依赖关系,判断哪些文件过时(文件生成后,源文件或头文件被修改了),然后使用Makefile中的编译命令进行编译。
例如:

main:main.o module1.o module2.o
    gcc main.o module1.o module2.o -o main
main:main.c head1.h head2.h common_head.h
    gcc -c main.c
module1.o:module1.c head1.h
    gcc -c module1.c
module2.o:module2.h head2.h
    gcc -c module2.h
#This is a makefile

(1)Makefile的基本构成
Makefile文件的基本单元时规则,一条规定指定一个或多个目标文件,目标文件后面接编译生成该目标文件所依赖的文件或模块,最后是生成或更新目标文件所使用的命令。规则格式如下:

目标文件列表  分隔符  依赖文件列表  [; 命令]
    [命令]
    [命令]

其中,[ ]中的内容时可选内容。
上面例子中,一二行构成一条规则,目标列表文件只有一个main,main后面的冒号(:)是分隔符,一般分隔符都是冒号。文件列表为main.o module1.o module2.o,为了生成main,需要这些依赖文件。第二行是生成目标文件所使用的命令,如果某一行时命令,必须以Tab键开头。如果某一行以Tab开头,make就认为这一行是一条命令。第一行时依赖关系,不是命令,因此不能以Tab开头。最后一行是注释,#

在依赖文件列表后加上一个分号(;),可以接上命令,如:

main:main.o module1.o module2.o ;gcc main.o module1.o module2.o -o main

(2)make如何解释执行Makefile
输入 make 命令
make首先在当前目录下寻找名为“makefile或“Makefile”的文件
I. 然后目标文件是否已经存在,决定是否编译生成;
II. 分析目标文件和依赖文件修改时间,如果目标文件比依赖文件晚(最新),无需生成,否则重新重新生成;
III. 回溯,依赖文件更新后回溯更新目标文件;

(3)其他说吗
I. 命令行间之间可以插入任意多空行,空行也要Tab开头;
II. 某一行过长,可以在行末输入反斜杠(),反斜杠与新行间不需要空白;
III. makefile也可以命令为Makeifle文件,也可以命名为其他文件名,如果时其他名字,执行make时,需要告诉make哪个时makefile文件;

make -f othername
make --file=othername

通常把makefile文件第一个规则的目标文件作为最终目标文件(终极文件)。

标签: none

评论已关闭