Linux项目自动化构建工具-make/Makefile

背景

1-会不会写 makefifile ,从一个侧面说明了一个人是否具备完成大型工程的能力
2- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefifile 定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
3-makefifile 带来的好处就是 ——“ 自动化编译 ,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。
4-make是一个命令工具,是一个解释makefifile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命 令,比如:Delphi make Visual C++ nmake Linux GNU make 。可见, makefifile 都成为了一 种在工程方面的编译方法。
5-make 是一条命令, makefifile 是一个文件,两个搭配使用,完成项目自动化构建。

理解

依赖例子

实例代码

C 代码
#include <stdio.h>
int main()
{
 printf("hello Makefile!\n");
 return 0;
}
Makefifile 文件中
这个文件是自己创建的,在里面添加编译的命令,更加方便

 make可以帮助我们在当前路径下查找Makefile文件

make不加名字执行就从上向下,make 加名字可以指定执行

hello:hello.o               //依赖关系
gcc hello.o -o hello    //依赖方法
hello.o:hello.s
gcc -c hello.s -o hello.o
hello.s:hello.i
gcc -S hello.i -o hello.s
hello.i:hello.c
gcc -E hello.c -o hello.i
.PHONY:clean
clean:
rm -f hello.i hello.s hello.o hello

依赖关系

冒号左侧依赖于冒号右边
上面的文件 hello , 它依赖 hell.o
hello.o , 它依赖 hello.s
hello.s , 它依赖 hello.i
hello.i , 它依赖 hello.c

依赖方法

gcc [选项] hello.*   - o  hello.* , 就是与之对应的依赖关系

原理

make 是如何工作的 , 在默认的方式下,也就是我们只输入 make 命令。那么,
1. make 会在当前目录下找名字叫 “Makefifile” “makefifile” 的文件。
2. 如果找到,它会找文件中的第一个目标文件( target ),在上面的例子中,他会找到 “hello” 这个文件, 并把这个文件作为最终的目标文件。
3. 如果 hello 文件不存在,或是 hello 所依赖的后面的 hello.o 文件的文件修改时间要比 hello 这个文件新(可
以用 touch 测试),那么,他就会执行后面所定义的命令来生成 hello 这个文件。
4. 如果 hello 所依赖的 hello.o 文件不存在,那么 make 会在当前文件中找目标为 hello.o 文件的依赖性,如果
找到则再根据那一个规则生成 hello.o 文件。(这有点像一个堆栈的过程)
5. 当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 hello.o 文件,然后再用 hello.o 文件声明
make 的终极任务,也就是执行文件 hello 了。
6. 这就是整个 make 的依赖性, make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文
件。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,
而对于所定义的命令的错误,或是编译不成功, make 根本不理。
8. make 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。

项目清理

工程是需要被清理的
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
return 0;
}
.PHONY:clean
clean:
rm -f hello.i hello.s hello.o hello
若第二次不可被执行,就加入伪指令
clean 这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make 执行。即命令 ——“make clean” ,以此来清除所有的目标文件,以便重编 译。 但是一般我们这种clean 的目标文件,我们将它设置为伪目标 , .PHONY 修饰 , 伪目标的特性是,总是被 执行的。 可以将我们的 hello 目标文件声明成伪目标,测试一下

Linux第一个小程序-进度条

注意除了打印字符后面还要打印命令行

\r&&\n

本质是控制光标的移动

什么都不加,光标会出现在后面不会被覆盖

 

\r:回车概念,让光标回到这一行最开始的地方
只用\r,会导致字符被命令行所覆盖
 

\n:换行概念,让光标换到下一行

 

 行缓冲区的概念

fflush(stdout)刷新缓冲区

 倒计时

 进度条

 

 

 

 

 头文件不需要考虑,编译期间就已经处理了,就在当前路径

在proc.c文件中 

最后make编译,再执行 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值