1.gcc/g++的使用
1.1程序翻译的过程
①预处理:展开头文件,替换宏,调节编译,去注释。
②编译:将代码变成汇编语言
③汇编:将汇编代码变成二进制不可执行的目标文件。
④链接:将多个我写的多个.cpp文件内容链接在一起,并与C++标准库链接起来。
分别生成的是-i ,-s ,-o文件,选项依次是-E -S -c;
演示预处理->编译->汇编->链接过程
2.动态库和静态库
2.1动态链接和静态链接
编译链接时与动态库链接就称为动态链接,与静态库的链接称为静态链接。
静态链接:编译链接时将静态库的代码全部放进可执行文件中。
动态链接:编译链接时不将动态库的代码放进可执行文件中,而是在程序执行需要时,再通过链接器链接到动态库中。
区别:
动态链接时,形成的可执行程序小,节省资源:内存,磁盘,网络,但是链接需要耗时。
静态链接时,形成的可执行程序大,浪费资源,但是不受之后库升级或者删除的影响。
2.2动态库和静态库
在linux下动态库都是以libxxx.so命名的,静态库是libxxx.a命名的。
我们可以用指令file 可执行程序名 来查看程序是动态链接还是静态链接。用lld 可执行程序名 查看程序的动态库或者静态库地址。
由此也可看成,我们生成的程序都是默认的动态链接,但是我们可以在链接时加上-static修饰,就能生成静态链接的可执行程序。值得注意的是,动态链接是库中自带的(因为Linux指令也是可执行程序,也是采用的动态链接),但是静态库一般要我们下载,他们库不是相同的。
yum install -y glibc-static C语言的静态库
yum install -y libstdc++ -static C++的静态库
yum install -y gcc-c++ C++的动态库
相同为我们提供了标准库的.h声明文件---告诉了我们该如何使用接口。
还提供了标准的动静态库。我们的代码 + 标准库的代码 = 程序
在Windows环境下的原理也是类似的,其动态库是以.dll后缀,静态库是.lib后缀
3.Linux项目自动构件化工具makefile---make
makefile是一个文件,make是一条命令,两个搭配使用完成项目的自动化构建
3.1 makefile
makefile中需要有两个部分组成:依赖关系和依赖方法。
其中文件有三个时间分别是access,modify,change时间 ,用stat指令可查看。touch可修改到当前时间
被.PHONY修饰的指令,不会受时间的影响而不执行,它总是执行。
3.2倒计时程序
1 #include <stdio.h>
2 #include <unistd.h>
3 int main(){
4 int n = 20;
5 while(n--){
6 printf("%2d\r",n);// \r为回车操作 \n为换行+回车操作
7 fflush(stdout);//将缓存区的数据输出到stdout
8 sleep(2);//休息2s
9 }
10 return 0;
11 }
值得注意的是即使printf先执行,但数据不一定先显示,有可能在缓冲区中。我们需要手动刷新缓冲区数据到stdout中。当缓存区遇到\n或者满时也会自动刷新。