论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
运维.售后
›
运维.售后
›
【Linux】编译器gcc/g++、动静态库
【Linux】编译器gcc/g++、动静态库
星球的眼睛
金牌会员
|
2024-11-22 08:31:49
|
显示全部楼层
|
阅读模式
楼主
主题
497
|
帖子
497
|
积分
1491
1.gcc / g++的工作流程
1.编译过程
预处理:宏更换,取解释,头文件展开,条件编译。
编译:将 C 语言,变成汇编语言。
汇编:将汇编语言,变成呆板可以识别的代码。
2.链接过程
链接:将目的文件与一些库链接在一起,天生可执行文件。
选项:-ESC 对应文件后缀 .iso
3.三大题目
1.如何明白条件编译?
条件编译的用途?
软件进行专业度收费情况,使用条件编译进行代码的动态裁剪(免费版在收费版的基础上阉割掉了一些功能)
内核源代码也是采用条件编译进行代码裁剪。
开辟工具、应用软件等,在差别的平台下(Linux / Windows)都可以运行,只必要一份经过条件编译的代码即可。
2.为什么C/C++编译,要先变成汇编语言?
由于历史发展的原因:
计算机初期是打孔编程(二进制编程)
由于打孔编程服从低,接着汇编语言诞生(二进制编写的),这里就必要编译器将汇编语言转化成计算机可以识别的二进制。
又由于汇编语言写步伐照旧较为困难,C语言诞生(汇编编写的),这里就必要编译器将C语言转化成汇编语言好呢?照旧转化成二进制好呢?答案当然是汇编语言。
再后来就是:C++/Java/golang/python,都是一个语言编写另一个语言,形成了百家争鸣的场面,若要都转化成二进制,工作量是非常巨大的,干脆站在巨人的肩膀上转化为汇编语言。
3.编译器的发展?
要发明一门语言,起首必要编译器向下编译成更加低层的语言。
现在的题目:编译汇编语言成二进制的编译器,是由什么编写的呢?总不能是汇编写的吧!答案:二进制版的编译器,编译汇编语言成二进制。接着用汇编语言写一个汇编编译器,从此以后二进制版的编译器就不用了,诞生了第一个由汇编语言写的编译器来编译汇编语言成二进制。该过程叫做:编译器的自举过程。
同理C语言也是以上过程。
4.函数库
1.什么是库?
库是一套方法 / 数据集,为我们开辟提供最基本的保证(基本接口,功能),加快我们的二次开辟。
我们的C步伐中,并没有定义 “printf” 的函数实现,且在预编译中包罗的 “stdio.h” 中也只有该函数的声明,而没有定义函数的实现,那么是在哪里实 “printf” 函数的呢?
答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中,在没有特别指定时,gcc 会到系统默认的搜索路径 “/usr/lib” 下进行查找,也就是链接到 libc.so.6 函数库中去,这样就能实现函数 “printf” 了,而这也就是链接的作用。
2.动态库和静态库
函数库一样平常分为静态库和动态库两种。
静态库是一种将多个目的文件(通常是编译后的代码文件,如 .o 文件或 .obj 文件)打包在一起的文件格式。在编译链接时,链接器会将静态库中的代码直接拷贝到终极的可执行文件中。这意味着每个使用静态库的步伐都会有一份库的副本,因此会导致可执行文件较大。
动态库是一种包罗代码和数据的文件,这些代码和数据可以在运行时被多个步伐共享。动态库在步伐运行时加载到内存中。这意味着多个步伐可以共享同一个动态库,从而节流磁盘空间和内存。
动态库和静态库的对比:
动态库形成的可执行步伐体积比静态库小。
静态库形成了可执行步伐后,就不再必要静态库,可执行步伐对静态库的依靠度小。动态库不能缺失,否则会导致步伐无法执行。
步伐运行必要加载到内存。静态链接,会在内存中出现大量的重复代码。
动态链接,比力节流内存和磁盘资源。
动态库:Linux(.os文件)Windows(.dll文件)
静态库:Linux(.a文件)Windows(.lib文件)
3.动态链接和静态链接
动态链接则发生在步伐运行时,而不是编译时。当步伐启动时,动态链接器(或装载器)会负责将步伐所需的动态库(共享库)加载到内存中,并解析步伐中的符号引用。与静态链接差别,动态链接允很多个步伐共享同一个库文件的代码和数据,从而节流磁盘和内存空间。别的,动态链接还使得步伐可以或许在运行时更新其依靠的库,而无需重新编译整个步伐。
静态链接发生在步伐的编译和链接过程中,当编译器将源代码编译成目的文件后,链接器会将这些目的文件以及所需的静态库归并成一个单一的可执行文件。在这个过程中,链接器会解析全部的符号引用,并将所需的库代码直接嵌入到可执行文件中。因此,静态链接的可执行文件在运行时不再必要额外的库文件,因为它们已经包罗了全部必要的代码和数据。
4.gcc / g++:默认动态链接,使用动态库
gcc
如何进行静态链接?前提:静态库必须存在,系统默认安装的是动态库,静态库必要自行安装
#CentOS下安装静态库指令
sudo yum install -y glibc-static
复制代码
g++
#下载g++编译器
sudo yum install -y gcc-c++
复制代码
#安装C++静态库
sudo yum install -y libstdc++-static
复制代码
图解
Linux中的指令大部分都是由C编写的,都必要依靠C动态库,若C动态库被删除了,这些指令都无法使用了。
5.库和链接的本质
一个场景:不想袒露源文件。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
星球的眼睛
金牌会员
这个人很懒什么都没写!
楼主热帖
体系集成项目招标要诀
微调神器LLaMA-Factory官方保姆级教程 ...
这可能是最全面的Spring面试题总结了 ...
Java项目:基于SSM框架实现的康健综合 ...
防止邮箱发信泄露服务器IP教程 ...
Git必知必会根本(07):git diff的利 ...
SecureCRT连接Linux利用教程
渗透攻防Web篇-深入浅出SQL注入 ...
LiteOS学习---开发环境初识
MGR复制架构+自动化运维平台,汽车之家 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表