谈Linux下编译和动静态链接

前言

看这篇博客之前请先看:

本篇博客是本人学习完之后的理解笔记

💓 个人主页:普通young man-CSDN博客

⏩ 文章专栏:C++_普通young man的博客-CSDN博客

⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com

若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章

目录

编译

条件编译

动静态链接

动态链接库

静态链接库

动静态库对比:

sudo无法提权


编译

首先,在代码形成可执行程序是都会经历的几个过程(这里我直接贴linux结果):

  • 预处理(进行宏替换、处理头文件包含等操作)

这里我是直接创建一个c文件,没写内容

  • 编译(将预处理后的代码转换为汇编语言)
  • 汇编(将汇编代码翻译成机器可识别的二进制代码)
  • 链接(将目标文件与所需的库函数链接,生成最终的可执行文件或库文件)

这个链接的操作我会举一个实验例子第二张图代码有误我修改了,但是不影响观察这个原理:

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

疑问1:为什么要有这四个过程?

说到这个,我就要说说语言的发展历史了,在以前最开始是通过开关控制计算机,又到后来的打孔编程,直到发展到二进制编程就成为了一个转折点了,后面又因为二进制实在反人类,所以后面就有人通过二进制编写了汇编,再后来我们的C语言之父(丹尼斯·里奇),通过汇编代码编写出了c语言,再后来的高级语言就出来了,比如python就是通过C语言再次编写出来的,在编写python就可以发现有c标准库,所以你会发现,其实这四个过程其实就是一个逆历史的过程

疑问2:编程语言出来了,那对应编译器是如何被编写出来的?

有一个概念叫"编译器的自举过程":比如我拿C语言举例,首先先用汇编语言编写出C语言,再用汇编语言编写出可以适配C语言的编译器,再通过C语言和这个适配的编译器再次编写一个用C语言编写的编译器

条件编译

条件编译的作用:允许程序员根据特定的条件,决定是否编译某一段代码

应用场景就是 软件版本管理,跨平台开发,或则就是游戏的内测版本,这个我就不代码举例了

可以写一个程序执行这个命令:


动静态链接

  1. 动态库:Linux(.so) windows (.dll)
  2. 静态库: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不能提权问题解决方法:

  1. vim /etc/sudoers 打开这个文件
  2. yy复制 p粘贴 修改你的用户名,最后退出就可以了

相关推荐
leoZ2311 小时前
项目改造为 Docker 容器使用指南
运维·docker·容器
初願致夕霞1 小时前
Linux编程_应用层_HTTP与HTTPS协议
linux·c++·http·https
http阿拉丁神猫1 小时前
Docker知识点汇总(6~10)
运维·docker·容器
charlie1145141912 小时前
嵌入式Linux驱动开发——驱动错误处理模式 - 当资源分配失败时该怎么办
linux·运维·驱动开发
用户2367829801682 小时前
Linux locate 命令:比 find 快 100 倍的文件搜索神器
linux
jimy12 小时前
Oracle的oci实例vm.standard.e2.1.micro安装tailscale
服务器·安全·oracle
XD7429716362 小时前
科技早报晚报|2026年5月8日:Agent 后端、文档索引与 token 控制层,今天更值得跟进的 3 个开源机会
运维·深度学习·自动化·开源项目·模型训练·科技新闻·ai工程化
巨大八爪鱼2 小时前
瑞芯微RK3308B嵌入式linux:实现interrupt-controller中断控制器
linux·interrupt·rockchip·rk3308b
铁手飞鹰2 小时前
PyModbus API对应的功能码和报文
linux·windows·python·modbus rtu·pymodbus