make命令的工作原理

举报
yd_221104950 发表于 2020/12/02 22:42:57 2020/12/02
【摘要】 编译程序时,我们通常直接在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 mai...

编译程序时,我们通常直接在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工作过程:

  1. make 在当前目录寻找“Makefile”或“makefile”文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),如上例它找到“app”这个目标文件,把这个文件作为最终的目标文件。 如果 app 文件不存在,或是 app 所依赖的后面的 .o 文件的文件修改时间要比 app 这个文件新,那么make命令就会执行后面所定义的命令来生成 app 这个文件。
  3. 如果app所依赖的.o文件也不存在,那么make命令会在当前文件中寻找目标为.o文件的依赖关系。如果找到,则再根据那一个规则生成 .o 文件,根据.o文件依赖的.c文件和.h文件,执行规则生成.o文件。
  4. 然后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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。