make的使用和makefile的编写
make的一般使用:
make从makefile文件中获取模块间的依赖关系,判断哪些过时了,根据这些信息确定哪些文件需要重新编译,然后使用makefile中的编译命令编译。过时是指一个文件生成后,用来生成该文件的源文件或者头文件被修改了,导致生成该文件所需要的源文件或者头文件修改时间比生成该文件的时间晚。
一个简单的makefile:
main:main.o module1.o module2.o
gcc main.o module1.o module2.o -o main
main.o: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.c head2.h
gcc -c module2.c
#this is a makefile
makefile的基本构成:
Makefile文件的基本单元是规则。一条规则指定一个或多个目标文件,目标文件后面根的是编译生成该目标文件所依赖的文件或模块,最后是生成或更新目标文件所使用的命令。
命令必须以tab开头,。某一行以tab开头后,makefile默认认为这一行是命令。
指示依赖关系不是命令,不以tab开头。
以#开头的是注释行,不会解析这行的内容。
2.make如何解释执行makefile
输入make;
首先在当前目录下寻找名为Makefile或者makefile的文件。
找到文件后开始寻找最开始的main文件。
发现没有main文件,开始寻找main文件依赖的文件:main.o,module1.o,module2.o。
发现没有依赖的文件,跳过编译的命令行,定位到第三行。
第三行main.o也没有,但是所依赖的文件可以在目录下找到,于是执行下面的gcc命令,生成了main.o。
定位第五行,发现module1.o没有,但是依赖文件可以找到,于是执行第六行。
第七、八行与第五、六行类似。
定位在最后一行,发现是注释行。
回溯到第一行,此时依赖文件已经生成,于是执行第二行命令,生成目标main文件。
执行make后提示:
gcc -c main.c;
gcc -c module1.c;
gcc -c module2.c;
gcc main.o module1.o module2.o -o main;
如果修改了其中一个文件:
执行make的时候会比较各个依赖文件的修改时间,发现某个文件比依赖文件要早,开始编译生成新的文件。
修改了head1.h后,会打印执行命令:
gcc -c main.c;
gcc -c module1.c;
gcc main.o module1.o module2.o -o main;
3.其他说明:
命令行直接可以插入任意多个空行,空行也要按tab开头。
如果某一行过长可以输入反斜杠\,由反斜杠链接起来的多行都被当做一行处理。
make把makefile文件中的第一个规则中的目标文件作为最终目标文件。
如果第一条规则中有多个文件,make把这些目标文件中的第一个作为最终目标文件。
通常最终目标文件是最后要编译生成的可执行文件。其他规则中的目标文件都是为了产生最终目标文件生成的中间文件。一般把最后生成的文件放在第一行。
make的一般使用:
make从makefile文件中获取模块间的依赖关系,判断哪些过时了,根据这些信息确定哪些文件需要重新编译,然后使用makefile中的编译命令编译。过时是指一个文件生成后,用来生成该文件的源文件或者头文件被修改了,导致生成该文件所需要的源文件或者头文件修改时间比生成该文件的时间晚。
一个简单的makefile:
main:main.o module1.o module2.o
gcc main.o module1.o module2.o -o main
main.o: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.c head2.h
gcc -c module2.c
#this is a makefile
makefile的基本构成:
Makefile文件的基本单元是规则。一条规则指定一个或多个目标文件,目标文件后面根的是编译生成该目标文件所依赖的文件或模块,最后是生成或更新目标文件所使用的命令。
命令必须以tab开头,。某一行以tab开头后,makefile默认认为这一行是命令。
指示依赖关系不是命令,不以tab开头。
以#开头的是注释行,不会解析这行的内容。
2.make如何解释执行makefile
输入make;
首先在当前目录下寻找名为Makefile或者makefile的文件。
找到文件后开始寻找最开始的main文件。
发现没有main文件,开始寻找main文件依赖的文件:main.o,module1.o,module2.o。
发现没有依赖的文件,跳过编译的命令行,定位到第三行。
第三行main.o也没有,但是所依赖的文件可以在目录下找到,于是执行下面的gcc命令,生成了main.o。
定位第五行,发现module1.o没有,但是依赖文件可以找到,于是执行第六行。
第七、八行与第五、六行类似。
定位在最后一行,发现是注释行。
回溯到第一行,此时依赖文件已经生成,于是执行第二行命令,生成目标main文件。
执行make后提示:
gcc -c main.c;
gcc -c module1.c;
gcc -c module2.c;
gcc main.o module1.o module2.o -o main;
如果修改了其中一个文件:
执行make的时候会比较各个依赖文件的修改时间,发现某个文件比依赖文件要早,开始编译生成新的文件。
修改了head1.h后,会打印执行命令:
gcc -c main.c;
gcc -c module1.c;
gcc main.o module1.o module2.o -o main;
3.其他说明:
命令行直接可以插入任意多个空行,空行也要按tab开头。
如果某一行过长可以输入反斜杠\,由反斜杠链接起来的多行都被当做一行处理。
make把makefile文件中的第一个规则中的目标文件作为最终目标文件。
如果第一条规则中有多个文件,make把这些目标文件中的第一个作为最终目标文件。
通常最终目标文件是最后要编译生成的可执行文件。其他规则中的目标文件都是为了产生最终目标文件生成的中间文件。一般把最后生成的文件放在第一行。