make命令的工作原理
编译程序时,我们通常直接在makefile文件所在目录下执行make命令:
makefile:
app:main.o hello.o gcc -o app main.o hello.o
main.o:main.c hello.h gcc -c main.c
hello.o:hello.c hello.h gcc -c hello.c
clean: rm app main.o hello.o
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
~/Desktop/mydir$ make
- 1
make工作过程:
- make 在当前目录寻找“Makefile”或“makefile”文件。
- 如果找到,它会找文件中的第一个目标文件(target),如上例它找到“app”这个目标文件,把这个文件作为最终的目标文件。 如果 app 文件不存在,或是 app 所依赖的后面的 .o 文件的文件修改时间要比 app 这个文件新,那么make命令就会执行后面所定义的命令来生成 app 这个文件。
- 如果app所依赖的.o文件也不存在,那么make命令会在当前文件中寻找目标为.o文件的依赖关系。如果找到,则再根据那一个规则生成 .o 文件,根据.o文件依赖的.c文件和.h文件,执行规则生成.o文件。
- 然后make再用 .o 文件生成执行文件 app。
make 会一层一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,如最后被依赖的文件找不到,那么 make 就会直接退出并报错。
make 只关注文件的依赖性,例如在找到了依赖关系之后,冒号后面的文件如果不存在就停止工作。所以通过上述分析,像clean 这种没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行。不过,可以显式指定make执行clean,即make clean,在上面的例子中是用来清除所有的目标文件和可执行文件app,以便重新编译。
如果这个工程已被编译过,那么当修改了其中一个源文件,如hello.c,根据我们的依赖性,目标文件 hello.o 会被重新编译,即依赖关系后面的命令,即命令gcc -c hello.c会被执行。此时hello.o文件就是最新的了。hello.o的文件修改时间比 app文件新,所以app会被重新连接。只要修改了与第一个目标文件存在直接或间接依赖关系的文件,都会发生重新编译和重新链接(链接目标文件生成可执行文件)。
参考: 《Makefile文件的组成及引用其它的Makefile和make的工作方式》
谢谢阅读!
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/103106578
- 点赞
- 收藏
- 关注作者
评论(0)