gcc/g++编译器

之前学习的vim为linux中编写程序的编写器,但是程序想要编译执行就还需要c语言的编译器gcc

程序翻译的过程

首先我们来了解一下程序编译语言的诞生历程

首先计算机只知道二进制,所以人们开始是用二进制编码,然后又用二进制编码写了一个汇编语言的编译器,此后就可以用汇编语言写代码,然后自举,用汇编语言写了了汇编语言的编译器。然后用汇编语言写了C语言的编译器,此后就可以用C语言来写代码。然后用C语言写了C语言编译器。然后就可以用c语言来写各种代码的编译器

把以上过程倒着退回去就是语言的翻译过程(配相关的gcc选项)

链接

为什么最后一步还需要链接呢?其实在我们写的代码中,只要用到了C标准里的东西,就要链接,比如printf,我们写的时候是直接用的,但是这个方法是C库里面的东西,所以在汇编后形成可冲定位二进制文件后,要于库里的文件链接,才能实现可执行文件

动态库和静态库

之前说的链接就是链接C语言的库,而C语言的标准库又分为动态库和静态库,他们的区别为:

动态库.so:动态链接,程序中只有库的地址,在使用的时候,去链接,使用完之后又回来,但是如果这个库被误删,那么之前链接过他的程序都将无法执行

gcc中程序默认链接的都是动态库


静态库.a:静态链接,在第一次链接的时候直接把要用到的库里的东西拷贝给程序,之后及时库不存在了,也不会影响程序的执行,但是这样的话对内存的消耗就变大了

gcc实现静态链接:linux中是没有C语言的静态库的,所以需要用户自己下载

安装C/C++静态库: sudo yum install -y glibc-static libstdc+±static

想要程序链接的是静态库的话,我们在编译时应该输入指令:

两种链接得到的可执行程序的大小可以看出:静态链接占用的内存比较大,

相关推荐
LCG元1 小时前
Crontab定时任务从入门到精通:教你如何实现日志切割、证书自动续期等十大实用场景
linux
叽里咕噜怪2 小时前
VMware-三种网络模式
linux·运维·服务器
艾莉丝努力练剑2 小时前
【Linux权限 (二)】Linux权限机制深度解析:umask如何决定默认权限与粘滞位的妙用
大数据·linux·服务器·c++·ubuntu·centos·1024程序员节
稚辉君.MCA_P8_Java3 小时前
Java 基本数据类型 - 四类八种
java·linux·后端·mysql·架构
东木君_3 小时前
芯外拾遗第二篇:编译、工具链、烧录,你真的搞懂了吗?
linux·单片机·操作系统·嵌入式
虚伪的空想家4 小时前
HUAWEI A800I A2 aarch64架构Ubuntu服务器鲲鹏920开启 IOMMU/SMMU 硬件虚拟化功能
linux·服务器·ubuntu
赖small强4 小时前
[Linux] 内核链表实现详解
linux·内核链表·双向循环链表·list.h·list_head
Linux技术芯4 小时前
浅谈kswapd按照什么原则来换出页面的底层原理
linux
獭.獭.4 小时前
Linux -- 线程控制
linux·pthread·线程分离·线程取消·线程局部存储·lwp·线程栈
feng_blog66884 小时前
环形缓冲区实现共享内存
linux·c++