谈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粘贴 修改你的用户名,最后退出就可以了

相关推荐
2023自学中8 小时前
C++ 内存追踪器
linux·c++
孫治AllenSun8 小时前
【Nginx】配置参数和使用案例
运维·nginx
啵啵鱼爱吃小猫咪9 小时前
Ubuntu 20.04 + ROS Noetic 源码安装 libfranka 0.8.0 和 franka_ros 0.8.0 完整教程
linux·运维·ubuntu
Piko61410 小时前
锐捷 VSU 虚拟化堆叠配置
运维·网络·笔记
ljs64827395110 小时前
Linux运维实操:vi编辑器永久配置静态IP(CentOS系列)
linux·运维·编辑器
dddwjzx10 小时前
嵌入式Linux C应用编程入门——高级I/O
linux·嵌入式
2301_7803039010 小时前
网络安全、自动化运维、ERP、CRM、MES
运维·web安全·网络安全·自动化·安全威胁分析
AOwhisky11 小时前
Python 学习笔记(第三期)——流程控制:条件判断与循环结构
运维·笔记·python·学习·云原生·流程控制·循环
IpdataCloud11 小时前
AI生成的Avalon恶意框架怎么防?用IP离线库识别模块化C2通信
运维·人工智能·网络协议·tcp/ip·ip
极客先躯11 小时前
高级java每日一道面试题-2026年03月30日-实战篇[Docker]-如何监控容器的网络流量?
java·运维·docker·容器·prometheus·高级面试