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

相关推荐
A小辣椒17 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒21 小时前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式