Linux makefile文件

makefile格式:


make makefile/Makefile(大小写都可以):
make是一个命令,makefile是一个目录文件

现在你写了一个test.c文件,要编译运行。

输入命令:vim makefile

在makefile文件内输入:


mytest:test.c
    gcc -o mytest test.c 

.PHONY:clean
clean:
    rm -f mytest


如何理解?


当你执行make XXX命令时,
make会根据makefile的内容,检测从上到下,完成对应的XXX依赖关系
make内部默认形成一对依赖关系和依赖方法
一个依赖关系,和一个依赖方法
如果你没指定对应的依赖关系,
就会默认执行第一个依赖关系,并且执行对应依赖关系的依赖方法
例如以下这个依赖关系
mytest:test.c
    gcc -o mytest test.c#注意,改行的第一个字符一定是Tab键
 第一行的mytest:test.c就是一个依赖关系,mytest是目标文件,冒号后面紧跟的是依赖文件列表,可以按照空格分割为多个文件
第二行的gcc -o mytest test.c就是对应的执行依赖方法
这个依赖关系描述的功能是:
将依赖列表中的文件经过依赖方法(这里是编译链接),生成对应的mytest可执行目标文件

为什么makefile对最新的可执行程序,默认不想重新形成?
效率问题
假设有2000个可执行程序,但是你只改了1个,或者压根没有改
可是,即使你没有改,一就要从头到尾编译一遍
有必要吗?没必要
不仅效率低,而且十分的没有必要

怎么做到的?

(makefile怎么知道我的程序要不要被编译呢?)
跟时间有关系
对比源文件的最新更改时间和可执行程序的最新时间
如果源文件的更新时间更新,那就需要编译
如果可执行程序的时间更新,那就不需要编译

PHONY:XXX
XXX对应的方法,总是要被执行
怎么做到总是被执行呢?
就是你不要去对比可执行文件和源文件各自的修改时间了
而是直接编译就行了


touch不仅能新建源文件,还能修改源文件的修改时间

上述的makefile操作依旧不够简单,感觉还是比较蛋疼。


相关操作符


code.exe:test.c
    gcc -o $@  $^ 
#$表示取内容
@表示目标文件
^表示依赖文件列表

makefile内可以使用变量:
bin=mycode#不能有空格
$(bin) #类似于宏替换,就是将$(bin)这个位置改成bin变量,而这个bin变量最终指向的是mycode

makefile文件会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有的依赖方法
因为makefile文件是从上到下进行检索的
如果第一个依赖关系不能执行(例如说不存在依赖文件等)
那就会将该依赖关系类似于进栈等候
然后继续检索下一个依赖关系
能执行,则进栈、执行、出栈、进而回溯
不能执行,继续检索下一个依赖关系
如此递推,类似于递归的模式

哪怕是顺序依赖关系的递推顺序是乱序的,依旧能够执行
但是,要保证第一个依赖关系是最终形成的目标文件
凡是总得有一个目标,没有目标,我怎么知道怎么走?

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十5画生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值