前言
看这篇博客之前请先看:
本篇博客是本人学习完之后的理解笔记
💓 个人主页:普通young man-CSDN博客
⏩ 文章专栏:C++_普通young man的博客-CSDN博客
⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com
若有问题 评论区见📝
🎉欢迎大家点赞👍收藏⭐文章
目录
编译
首先,在代码形成可执行程序是都会经历的几个过程(这里我直接贴linux结果):
- 预处理(进行宏替换、处理头文件包含等操作)
这里我是直接创建一个c文件,没写内容


- 编译(将预处理后的代码转换为汇编语言)

- 汇编(将汇编代码翻译成机器可识别的二进制代码)

- 链接(将目标文件与所需的库函数链接,生成最终的可执行文件或库文件)
这个链接的操作我会举一个实验例子第二张图代码有误我修改了,但是不影响观察这个原理:



这里可以观察一下我调用的那些库:ldd +程序名

疑问1:为什么要有这四个过程?
说到这个,我就要说说语言的发展历史了,在以前最开始是通过开关控制计算机,又到后来的打孔编程,直到发展到二进制编程就成为了一个转折点了,后面又因为二进制实在反人类,所以后面就有人通过二进制编写了汇编,再后来我们的C语言之父(丹尼斯·里奇),通过汇编代码编写出了c语言,再后来的高级语言就出来了,比如python就是通过C语言再次编写出来的,在编写python就可以发现有c标准库,所以你会发现,其实这四个过程其实就是一个逆历史的过程
疑问2:编程语言出来了,那对应编译器是如何被编写出来的?
有一个概念叫"编译器的自举过程":比如我拿C语言举例,首先先用汇编语言编写出C语言,再用汇编语言编写出可以适配C语言的编译器,再通过C语言和这个适配的编译器再次编写一个用C语言编写的编译器
条件编译
条件编译的作用:允许程序员根据特定的条件,决定是否编译某一段代码
应用场景就是 软件版本管理,跨平台开发,或则就是游戏的内测版本,这个我就不代码举例了
可以写一个程序执行这个命令:

动静态链接
- 动态库:Linux(.so) windows (.dll)
- 静态库:Linux(.a) windows(.lib)
动态链接库
比喻:你去学校上学,只需要带个饭盒去食堂(地址)。食堂(共享库)是公用的,大家都在那里吃饭
验证:
随便编译一个代码,会发现它默认是动态链接:

占用空间:


静态链接库
比喻:想象你要去野外生存一个月。你出发前,把这一个月的所有东西(帐篷、水、食物、衣服)全部打包进你的背包里
这里需要下载一个C语言的静态库,如果你是c++的话也需要下载一个c++的静态库
C:sudo yum install glibc-static
CPP:sudo yum install libstdc++-static
验证: gcc test.c -o static_test -static

动静态库对比:
- 静态把我们程序中使用的库方法,拷贝给我自己,静态库只有在链接的时候有用,一旦形成可执行程序,静态库可以不再需要
- 动态库形成的可执行程序体积一定很小
- 可执行程序对静态库的依赖度小,动态库不能缺失
- 程序运行,需要加载到内存,静态链接的,会在内存中出现大量的重复代码。
- 动态链接,比较节省内存和磁盘资源
这一点其实也可以从内存中看出来,动态链接只需要再内存中创建一份供调用,而静态库可能要执行一段代码好多次(这个需要去学习堆栈才懂),我的图主要是我自己能看懂
sudo无法提权
附加一个centos7普通用户sudo不能提权问题解决方法:

- vim /etc/sudoers 打开这个文件

- yy复制 p粘贴 修改你的用户名,最后退出就可以了



