在linux里面编译一个程序文件需要使用gcc/g++,但是在一个工程里面或许含有的不只是一个文件,那么这时候一个一个文件的编译时很耗时同时也会增大程序出错的风险。那么在linux里面可以使用make这个指令来进行对多个文件进行编译。
在linux里面除了make指令可以一次将对个文件同时编译,还有shell script来将对多个问阿金的操作都集合在一起。但是,使用make有以下几点好处:
* 简化编译时所需要执行的命令
* 若在编译完成之后,修改某个源码文件,则make仅会针对被修改的文件进行编译,其他的目标文件不会被更改
* 最后可以依照相依性来更新执行文件
举个栗子:
main:main.o add.o sub.o mul.o
2 gcc main.o add.o sub.o mul.o -o main
3 add.o:add.c
4 gcc -c add.c -o add.o
5 sub.o:sub.c
6 gcc -c sub.c -o sub.o
7 mul.o:mul.c
8 gcc -c mul.c -o mul.o
~
~
makefile的基本语法与变量:
- 基本语法
目标(target):目标文件1 目标文件2
gcc -o 新建的可执行文件 目标文件1 目标文件2 - 其中目标就是我们想要建立的信息,而目标问阿仅就是具有相关性的object files ,建立可执行文件的而语法就是以按键开头的哪一行,
- 特别留意:命令行必须是以键作为开头才可以!
- 基本规则:
在makefile里面的#代表着批注
必须是在命令行的第一个字符
目标文件和相关文件之间必须是以“:”隔开
示例:
add.c文件:
#include"add.h"
2
3
4
5 int add(int a,int b)
6 {
7 return a + b;
8 }
~
sub.c文件:
#include"sub.h"
2
3
4
5 int sub(int a,int b)
6 {
7 return a - b;
8 }
~
main.c文件:
main:main.o add.o sub.o
3 gcc -o main main.o add.o sub.o
4 add.o:add.c
5 gcc -c add.c -o add.o
6 sub.o:sub.c
7 gcc -c sub.c -o sub.o
8 clean:
9 rm -rf main.o add.o sub.o
接下来就是makefile的内容:
makefile文件:
main:main.o add.o sub.o
3 gcc -o main main.o add.o sub.o
4 add.o:add.c
5 gcc -c add.c -o add.o
6 sub.o:sub.c
7 gcc -c sub.c -o sub.o
8 clean:
9 rm -rf main.o add.o sub.o
当我们执行make
指令的时候,结果:
当执行完着个简单的makefile之后,会将所有的可处理之后的文件全部你放在main这个文件里面。
当执行./main
的时候,结果:
注:这里出现的数字是在main函数里面调用函数处理之后的结果。
但是有的时候写makefile的时候会写很多的指令,那么在设计makefile的时候就可以使用变量的基本语法来设计:
例如:
***将上面的makefile改成修改
OBJS = main.o add.o sub.o
LIBS = -lm
main:main.o add.o sub.o
gcc -o main ${OBJS} ${LIBS}
clean:
rm -rf main ${OBJS}
这里用OBJS来替换mian.o add.o sub.o
ILBS来替换-lm
运行make
指令后的结果:
注:这里只改变的是main这个文件里面的内容,所以只更新了main文件。
变量的基本语法:
- 变量和变量的内容以“=”隔开,同时,两边可以具有空格
- 变量的左边不可以有,例如上面的范例第一行OBJS左边不可以有;
- 变量和变量的内容之间使用“=”两边不可以具有“:”;
- 在习惯上,变量最好是以“大写字母”为主;
- 运用变量时,以¥{变量}或者¥(变量)使用;
- 在该shell的环境变量里面可以被套用;
- 在命令行模式下也可以定义变量;
由于gcc在进行编译行为时,会主动去读取这个环境变量,所以可以直接在shell定义出这个环境变量;
如果这样做并不能很好的减少代码量的话可以利用命令行进行输入,也可以在文件内直接输入指定的环境变量。
例如:
OBJS = main.o add.o sub.o sub.o
LIBS = -lm
main:main.o add.o sub.o
gcc -o $@ ${OBJS} ${LIBS}
clean:
rm -rf $@ ${OBJS}
调用make
后的结果:
这里的$@
表示目标文件,$^
表示所依赖文件
环境变量的却用规则:
- make命令行后面加上的环境变量为第一优先
- makefile里面的环境变量为第二优先
- shell里面本来原有的环境变量为第三优先
简单进度条的实现
代码:
#include<stdio.h>
#include<unistd.h>
int main ()
{
char arr[101] = "#";
char* r = "\\|/-\\";
int i = 0;
for(;i<101;i++)
{
printf("[%-100s][%c]\r",arr,r[i%6]);
arr[i] = '#';
fflush(stdout);
usleep(100000);
}
return 0;
}
结果: