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

相关推荐
MIXLLRED3 分钟前
解决: Ubuntu 22.04上树莓派4B扩展板ROS2兼容性修复指南
linux·ubuntu·树莓派
zizle_lin7 分钟前
CentOS配置yum源
linux·运维·centos
志栋智能13 分钟前
超自动化运维:如何降低人为错误?
大数据·运维·网络·人工智能·自动化
达达爱吃肉26 分钟前
claude 接入deepseek 运行报错
java·服务器·前端
武器大师7237 分钟前
从零开始在 Linux 上编译运行 lvgljs 图形界面项目
linux·运维·服务器
剑神一笑39 分钟前
Linux free 命令深度解析:从内存监控到 OOM 排查的完整指南
linux·运维·服务器
蘑菇丁1 小时前
招聘大数据运维工程师(郑州)
大数据·运维
NiceCloud喜云1 小时前
Claude Code 跑 HyperFrames 实测:本地生成 AI 视频素材全流程
java·运维·人工智能·自动化·json·音视频·飞书
似水এ᭄往昔1 小时前
【Linux网络编程】--计算机网络基础
linux·网络·计算机网络
qq_312920111 小时前
服务器被攻击!完整安全加固清单汇总
运维·服务器·安全