Linux编译链接and缓冲区

发布于:2022-12-13 ⋅ 阅读:(194) ⋅ 点赞:(0)

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:进度条小程序

代码如下:
在这里插入图片描述
效果如下:
在这里插入图片描述