makefile介绍及示例

举报
yd_221104950 发表于 2020/12/03 00:27:28 2020/12/03
【摘要】 概述 一个开发工程会有很多的源文件,它们按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译等。makefile文件关系到整个工程的编译规则。写好的makefile,只要运行make命令,就会按makefile里定义好的规则来编译工程。 make 是一个用来解析makefile...

概述

一个开发工程会有很多的源文件,它们按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译等。makefile文件关系到整个工程的编译规则。写好的makefile,只要运行make命令,就会按makefile里定义好的规则来编译工程。

make 是一个用来解析makefile文件中的指令的命令工具。大多数的 IDE 都有这个命令,如Linux下 GNU 的 make。不同产商的 make各不相同,我们这里只介绍Linux上的make,版本为GNU Make 4.1,默认的编译器是gcc。

编译和链接

可以参考《gcc编译程序的过程》

makefile 的书写规则

target ... : prerequisites ...
	command
	...
	...

  
 
  • 1
  • 2
  • 3
  • 4

target:可以是目标文件、执行文件、标签。
prerequisites: 生成该 target 所依赖的文件或 target。
command:生产该 target 要执行的命令(任意的 shell 命令),即生成规则定义在 command 中。
注意:
prerequisites 中如果有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行。

依赖关系的实质就是说明目标文件是由哪些文件生成的,目标文件是由哪些文件更新的。
在定义好依赖关系后,command定义了生成目标文件的指令,指令前一定要以一个 Tab键作为开头

make命令会比较 targets文件和 prerequisites 文件的修改日期。如果 prerequisites 文件的日期比 targets 文件的日期新,或者 target 不存在的话,那么make 就会执行command定义的命令。

示例

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

(1)将内容保存到文件名为“makefile”或“Makefile”的文件中。
(2)然后在该目录下直接输入命令 make 就可以生成执行文件 app。
(3)执行make clean可以删除执行文件和产生的目标文件。clean是一个动作名字(可以任意定义),不是一个文件,其冒号后什么也没有,因此make 就不会自动去找它的依赖,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在 make 命令后显式指出这个 label 的名字。这非常有用。我们可以在一个 makefile 中定义一些不用编译或者和编译无关的命令,如程序的打包,程序的备份等。

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
  • 10

谢谢阅读!

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/103094816

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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