make和makefile有什么用?
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的
规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂
的功能操作
makefile带来的好处就是------"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编
译,极大的提高了软件开发的效率。
我们首先要明确make是一个指令,而makefile是一个文件(依赖关系和依赖方法)
什么是依赖关系和依赖方法:
依赖关系:我为什么要帮你
依赖方法:怎么帮
具体实例:
TIP:
1、Makefile和make形成目标文件的时候,默认是从上到下扫描makefile文件的。
2、默认只形成一个
问题:make和makefile怎么知道可执行程序是比较新的呢?
答:这个是通过对比时间比出来的,只要可执行程序的最近修改时间比所有源文件的最近修改时间新,说明它就是最新的!
认识一下时间:(ACM)
stat关键字查询文件的时间
文件 = 内容 + 属性
这里一共有三个时间,具体文件的时间与modify(文件内容)一致。
access表示进入文件的时间(可能不会实时)
modify表示修改文件内容的具体时间
change表示修改文件属性的具体时间
下面的各个点都表示文件的属性,因此modify修改,change一定会修改;而change(属性)修改,modify(内容)不一定修改!!!
我们可不可以在文件内容没有更新的情况下强制执行命令呢?
可以,这里需要另一个语法 .PHONY:
其中mybin也可以这样书写
问题:我们这里为什么不把伪目标加到生成可执行文件上,而是加到clean上呢?
假设我们有一个大项目,里面包含了几百个源文件,如果我们只修改其中的几个源文件,这时加上伪目标,仍然生成几百个可执行文件,就大大浪费时间空间等资源,我们只需要生成我们修改过的源文件即可。
Linux第一个小程序------进度条
第一个小技巧:
我们以后再写程序之前,先把makefile跑通之后再写test.c的内容。
1、预备的两个小知识
a、缓冲区
输出结果没有立刻输出 you can see me
而是等了3秒钟,才将结果输出,难道是先执行sleep(3) 吗?
我们时刻铭记程序的执行顺序一定是顺序结构的!
因此正确的解释就是printf已经跑完,输出的字符串一定是被保存起来了。被保存的地点就是缓冲区。在退出程序的时候,才刷新出来。
b、回车和换行
回车和换行本质上来说是两个东西。
在老式的键盘中,enter键长这样。
换行就是将内容换到下一行。
回车是将光标放在这一行的最初始位置。
先换行再回车,才有了enter的效果。
下面是普通版本的
cpp
1 #include<stdio.h>
2 #include<unistd.h>
3
4 int main()
5 {
6 int cnt = 9;
7 while(cnt)
8 {
9 printf("%d\r", cnt);
10 fflush(stdout);//刷新标准输出流
11 cnt--;
12 sleep(1);
13 }
14
15 return 0;//程序就开始结束
16 }
\r表示回车,就是将光标重新放在第一位。
其中fflush将缓冲区的数据流进行刷新,防止标准输出流没有显示