Linux编译链接and缓冲区
1:程序翻译的四大阶段
1.1:预处理
gcc -E 目标文件 -o 新成预处理文件 .i -o 指明一个新的文件
-E 从现在开始进行程序的翻译,如果预处理完成,就停下来
1:翻译时将头文件的内容拷贝到源文件中。
2:进行了宏替换。
3:源文件里面的注释代码被去掉了。
4:设置的条件编译也被去掉了。
1.2:编译
gcc -S 检查语法 -o 新的编译文件.s 从现在开始进行程序的翻译,如果编译完成就停下来。
1.3: 汇编
汇编:(将编译汇编文件内容换成二进制的不可执行文件.obj)
gcc -c 编译文件 新生成的汇编文件.o -c从现在开始进行程序的汇编,如果汇编完成就停下来。
1.4:链接
4:最后链接(行成exe可执行文件)
总的来说Esc是翻译的三个选项。
新成的文件后缀分别为 i,s,o。
1.4.1动静态库
ls /usr/include/stdio.h 提供c语言的方法列表,函数的声明。
通过头文件找方法的声明,通方过静态库去找法的实现,然后把我的源文件代码与动静态ls /lib64 提供c语言的函数实现。(包含了Linux下的动静态库)库的代码以某种形式联合起来,就变成了可执行程序。
ls /lib64 提供c语言的函数实现。(包含了Linux下的动静态库)
Linux:.so(动态库),.a(静态库)。
window: .dll(动态库), .lib(静态库)。
总结:
动态链接
:将库中我要的函数实现的地址,填入我的可执行程序中,建立关联。
优点:节省资源
静态链接
:将库w中方法的实现,真的拷贝到我们的可执行程序中。
缺点:占用资源。
静态库如何实现??
动ls /lib64/lib.c 查看动静态库*
查看Linux下链接使用动静态库:
ldd 链接文件 编译成形成的文件 查看他们链接的动态类型。
file 链接文件 编译成形成的文件 查看他们链接的动态类型。
如何安装静态库?
sudo yum install -y glibc-static c静态库
sudo yum install -y glibstdc++±static
c++静态库
2:Makefile文件
第一行左边:执行方法生成的目标文件。
右边:所要依赖的文件
.PHONY : 文件结尾关键字
clean: 结尾清除(可随意写名字)
当我们make之后再进行make会出现以下情况:
原因是:
Makefile是如何得知我们的可执行程序是最新的??
根据文件的最近修改时间来的!!
源文件是要比执行文件时间更早或者相等的。
如果源文件修改了,那么源文件的修改时间就比可执行文件的时间晚,那么可以再次编译。
再编译时,源文件和可执行文件相等, 那么就不会再次编译了。、
所以平常一定要即使删除。
3: 浅谈缓冲区
C语言是会给我们提供输出缓冲区的,根据特定的刷新测略,来进行刷新。
输出缓冲区:就是c语言给我们提供的一段内存空间。
显示器设备,
1:一般的刷新策略是行刷新。(碰到\n,就把\n之前所有的字符全部给我显示出来)。
3.1:fflush函数
1:fflush (stdout) 将再执行完的程序立即打印出来。
2:换车与换行
在这里插入代码片
#include <stdio.h>
#include <unistd.h>
int main()
{
int count = 3;
while(count >= 0)
{
printf("%d\r", count--);
sleep(1);
}
return 0;
}
刚开始没有显现:每一次执行完程序,光标都回到了第一行的第一个位置(只进行了\r,没有经过\n刷新),要打印内容开通一直在缓冲区。
最后没有显现的原因是:每次打印光标都在缓冲区的最开始,直到最后一次显示完,光标依旧在缓冲区的最开始。**
加入fflush函数时:
在这里插入代码片
#include <stdio.h>
#include <unistd.h>
int main()
{
int count = 3;
while(count >= 0)
{
printf("%d\r", count--);
fflush(stdout);
sleep(1);
}
return 0;
}
3.2:进度条小程序
代码如下:
效果如下: