星球的眼睛 发表于 2024-11-22 08:31:49

【Linux】编译器gcc/g++、动静态库

1.gcc / g++的工作流程

1.编译过程


[*]预处理:宏更换,取解释,头文件展开,条件编译。
https://i-blog.csdnimg.cn/direct/083ca8060f11406dbb3b861f7be685ba.png
https://i-blog.csdnimg.cn/direct/448615034e354d49b8bba679ec03ac4c.png

[*]编译:将 C 语言,变成汇编语言。
https://i-blog.csdnimg.cn/direct/08e512c797d849a19d2d273ba74053f6.png

[*]汇编:将汇编语言,变成呆板可以识别的代码。
https://i-blog.csdnimg.cn/direct/00d7b7c8b5e748558ae9bfd71c7e7338.png
2.链接过程

链接:将目的文件与一些库链接在一起,天生可执行文件。
https://i-blog.csdnimg.cn/direct/c082342b7d1e400283490b419c5ca914.png
选项:-ESC 对应文件后缀 .iso
3.三大题目

1.如何明白条件编译?

https://i-blog.csdnimg.cn/direct/04a69220df3c473ba702783bbade2427.png
条件编译的用途?

[*]软件进行专业度收费情况,使用条件编译进行代码的动态裁剪(免费版在收费版的基础上阉割掉了一些功能)
[*]内核源代码也是采用条件编译进行代码裁剪。
[*]开辟工具、应用软件等,在差别的平台下(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” 了,而这也就是链接的作用。
https://i-blog.csdnimg.cn/direct/77758580dc5c474abed24d9bfead3c19.png
2.动态库和静态库

函数库一样平常分为静态库和动态库两种。

[*]静态库是一种将多个目的文件(通常是编译后的代码文件,如 .o 文件或 .obj 文件)打包在一起的文件格式。在编译链接时,链接器会将静态库中的代码直接拷贝到终极的可执行文件中。这意味着每个使用静态库的步伐都会有一份库的副本,因此会导致可执行文件较大。
[*]动态库是一种包罗代码和数据的文件,这些代码和数据可以在运行时被多个步伐共享。动态库在步伐运行时加载到内存中。这意味着多个步伐可以共享同一个动态库,从而节流磁盘空间和内存。
动态库和静态库的对比:

[*]动态库形成的可执行步伐体积比静态库小。
[*]静态库形成了可执行步伐后,就不再必要静态库,可执行步伐对静态库的依靠度小。动态库不能缺失,否则会导致步伐无法执行。
[*]步伐运行必要加载到内存。静态链接,会在内存中出现大量的重复代码。
[*]动态链接,比力节流内存和磁盘资源。
动态库:Linux(.os文件)Windows(.dll文件)
静态库:Linux(.a文件)Windows(.lib文件)
3.动态链接和静态链接


[*]动态链接则发生在步伐运行时,而不是编译时。当步伐启动时,动态链接器(或装载器)会负责将步伐所需的动态库(共享库)加载到内存中,并解析步伐中的符号引用。与静态链接差别,动态链接允很多个步伐共享同一个库文件的代码和数据,从而节流磁盘和内存空间。别的,动态链接还使得步伐可以或许在运行时更新其依靠的库,而无需重新编译整个步伐。
https://i-blog.csdnimg.cn/direct/dc154c6bc5044784bf2acce08f3edc23.png

[*]静态链接发生在步伐的编译和链接过程中,当编译器将源代码编译成目的文件后,链接器会将这些目的文件以及所需的静态库归并成一个单一的可执行文件。在这个过程中,链接器会解析全部的符号引用,并将所需的库代码直接嵌入到可执行文件中。因此,静态链接的可执行文件在运行时不再必要额外的库文件,因为它们已经包罗了全部必要的代码和数据。
https://i-blog.csdnimg.cn/direct/605928623d914169813560a0142086da.png
4.gcc / g++:默认动态链接,使用动态库

gcc
https://i-blog.csdnimg.cn/direct/671012ad30454644a945aa9277ad0a91.png
https://i-blog.csdnimg.cn/direct/04b36aeb90da4ddc89e83c61fe6ab562.png
https://i-blog.csdnimg.cn/direct/9be271f54a0549a6984e4f2e82d04917.png
https://i-blog.csdnimg.cn/direct/c1cbcbf002ad4a6482d4636a98bae9ac.png
如何进行静态链接?前提:静态库必须存在,系统默认安装的是动态库,静态库必要自行安装
#CentOS下安装静态库指令
sudo yum install -y glibc-static
https://i-blog.csdnimg.cn/direct/babf8b3023c14068b3bc9bb08043a1c6.png
https://i-blog.csdnimg.cn/direct/e38c4dadf4624f5094dff071b1e73a37.png
g++
#下载g++编译器
sudo yum install -y gcc-c++
https://i-blog.csdnimg.cn/direct/8cbc99c86f614d9f8a9926ac3ff18a02.png
#安装C++静态库
sudo yum install -y libstdc++-static
https://i-blog.csdnimg.cn/direct/518cff455df84df19ec00149d3214fac.png
https://i-blog.csdnimg.cn/direct/c88b9e5121804dbfa82fed78de37224c.png
图解
https://i-blog.csdnimg.cn/direct/b6a8c2da875f4757950f30161ed96a19.png
Linux中的指令大部分都是由C编写的,都必要依靠C动态库,若C动态库被删除了,这些指令都无法使用了。
5.库和链接的本质

https://i-blog.csdnimg.cn/direct/496243a6db5d430b879ccb7408ac8828.png
一个场景:不想袒露源文件。
https://i-blog.csdnimg.cn/direct/678e2c8fa95d470bb5ba8a10b8dc5070.png
https://i-blog.csdnimg.cn/direct/c5231b672ebb4ac4934c4e5fe9a2b582.png
https://i-blog.csdnimg.cn/direct/b11696f8c91b41d5873a16fc9b8698bb.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Linux】编译器gcc/g++、动静态库