文章目录
- gcc介绍
- gcc使用
- gcc -E
- gcc -S
- gcc -c
- gcc *.o
- gcc *.c一步到位翻译
- 动静态库介绍
- 动态链接和静态链接
- 动态链接
- 静态链接
- 动静态链接总结
gcc介绍
gcc是一款翻译器,专门用来翻译C语言文本的翻译器。
程序的翻译过程:
是C文本---->计算机二进制可执行程序的过程
期间经历的4个过程
1.预处理
2.编译
3.汇编
4.链接
预处理工作:
1.去注释2.宏替换3.头文件展开4.条件编译等等
编译工作:
把C代码转化成汇编代码
汇编工作:
把汇编代码转化成可重定向二进制文件
链接工作:
链接多个.o文件合并成可执行程序
gcc使用
gcc -E
功能:从.c文件开始翻译程序,如果预处理阶段完成则停下来,并保存期间形成的文件。
接下来我们用一段代码来测试一下看预处理阶段是不是完成之前所讲的哪些工作。
测试代码:
测试结果:
从图片结果中可以看出确实,完成了上面之前预处理所讲的哪些工作。
gcc -S
功能:从.c文件或者.i文件,开始翻译程序,如果编译阶段完成则停下来,并保存期间形成的文件。
从图中我们可以看到确实生成了test.s文件,那么到底是不是汇编代码呢?我们进入test.s文件看一下。
从图中的代码我们可以看到确实是汇编代码。
gcc -c
功能:从.c或者上面生成的任何一个文件开始,如果汇编阶段完成则停下来,并保存期间生成的文件。
我们进入其中看看是不是二进制文件
我们可以看到确实是意图我们看不懂的由一堆二进制构成的字符。
那么问题来了这个文件能执行吗?
我们可以看到这个文件没有可执行的权限,所以不能执行。那么如果加上可执行的权限呢?
我们可以看到确实就算加上可执行,.o文件也不能被执行。那么为什么呢?因为还差一个链接的阶段。
gcc *.o
功能:链接.o文件形成可执行程序
我们可以看到最后确实成功的生成了可执行。
那么这时候就有人问了生成可执行程序这么难吗?要这么多步骤,步骤确实这么难,但是我们自己翻译的时候可以一步到位不用这么难。
gcc *.c一步到位翻译
功能:直接从.c文件生成可执行
动静态库介绍
由上面我们可以知道翻译的最后一步是要链接,那么到底要链接什么呢?其实是要链接库,如果C语言没有库的话,那么你写个printf都会报错。
上面图就是我们刚才上面的程序所用到的库
那么动态库和静态库有什么区别呢?
Linux下:
动态库以.so结尾
静态库以.a结尾
Windows下:
动态库以.d结尾
静态库以.lib结尾
我们以前学C/C++的时候会安装vs2019或者其它vs,之前我们认为是在安装软件,现在应该明白了其实是在安装库。
动态链接和静态链接
动态链接
下面讲一则故事来讲解动态链接
背景介绍:
有一座学校(华侨中学),学校具有高中部和初中部,在学校的旁边具有一间网吧(E吧)。
人物介绍:
故事开始:
小华作为一名高一新生,非常喜欢学习编程但是华侨中学的校规校纪非常严格不允许带任何电子设备,苦于无奈小华只能找学长问学校周围有为有网吧。
小华的得知学校旁边有电脑于是,开始做计划计划清单,计划每天花点时间去学编程。
每天到了学编程的时间小华总是跑去网吧,结束就回到宿舍
然后继续执行清单的任务
小华执行清单的过程就像程序运行的过程,当程序需要用到库的时候,程序就自己去调用库的地址。
静态链接
下面用一个故事来介绍一下静态链接
背景:还是之前那个小华,经过了三年的努力终于考上了北清大学。北清大学旁边也有一间网吧(京华网吧)。
小华考上了大学,大学比较开放允许学生带电子设备,小华的爸爸给他买了一台 京华网吧的台式机电脑放在他的宿舍,接下来小华就再也不用去网吧学习编程了。小华只要在宿舍里就能学习编程。
上面的故事就是静态链接,静态链接就是把库的内容放在C语言文件中,这样就不用再去库中寻找内容。
动静态链接总结
动态链接:将库中我要的方法的地址填入我的可执行程序中,建立关联
静态链接:将库中方法的实现真正的拷贝到我们的可执行程序中
演示:
从上图中我们可以明显看到静态链接的文件比动态链接大。
估计大部分人的gcc的静态链接都用不了。因为大部分linux都没有安装C静态库和C++静态库
所以只要执行下面这条指令,输入用户密码即可。
g++的几乎所有情况都与gcc差不多这里就不介绍怎么使用g++了。
下面是C++的静态库安装指令