自学内容网 自学内容网

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文件是从上到下进行检索的
如果第一个依赖关系不能执行(例如说不存在依赖文件等)
那就会将该依赖关系类似于进栈等候
然后继续检索下一个依赖关系
能执行,则进栈、执行、出栈、进而回溯
不能执行,继续检索下一个依赖关系
如此递推,类似于递归的模式

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


原文地址:https://blog.csdn.net/qq_51216031/article/details/137753886

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!