【Linux】初识动静态库/动静态链接

文章目录

  • 动静态库的基本原理
  • 认识动静态库
  • 动静态库的特性
  • 手动安装静态库


动静态库的基本原理

首先,文件和头文件最终变成一个可执行程序需要经历以下四个步骤:

1)预处理:预处理所要完成的有,头文件展开、去注释、宏替换、条件编译。C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到.i文件中等待进一步处理,最终形成xxx.i文件。

2)编译:完成词法分析、语法分析、语义分析、符号汇总等,检查无误后将代码翻译成汇编指令,最终形成xxx.s文件。

3)汇编:汇编代码转为二进制目标代码(机器语言),形成.obj的文件。

4)链接:将汇编过程产生的二进制代码进行链接,即上述过程产生的.obj文件和系统库的obj文件链接起来,最终生成了可以在特定平台运行的可执行文件。

例如,用test1.c以及main1.c形成可执行文件,我们需要先得到各个文件的目标文件test1.o、以及main1.o,然后再将这写目标文件链接起来,最终形成一个可执行程序。而实际上,对于可能频繁用到的源文件,像test1.c、test2.c、test3.c,我们可以将它们的目标文件test1.o、test2.o、test3.o进行打包,之后需要用到这四个目标文件时就可以直接链接这个包当中的目标文件了,而这个包实际上就可以称之为一个库

总结:实际上,所有库本质都是一堆目标文件(xxx.o)的集合,动静态库的本质是可执行程序的“半成品”。

认识动静态库

问题:我们为什么能在Linux下完成C/C++代码的编译呢?

答:因为Linux已经默认携带了语言级别的头文件和语言对应的库。
在命令行输入如下命令,我们就可以看到Linux中的很多库:

在这里插入图片描述
在这里涉及到一个重要的概念:函数库

  • 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf”函数的呢?
  • 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

函数库一般分为静态库和动态库两种。

接下里我进行演示,首先,我们先touch创建一个测试文件,我暂且将其命名为test.c,然后我们利用vim编辑器命令,编辑文件,我在test.c文件写入了以下代码:vim的使用详解请点击这里
在这里插入图片描述
这是最简单的代码,默认生成a.out执行程序,运行结果大家也都知道,就是hello world。
在这里插入图片描述

接下来我们就通过这份简单的代码踏入动静态库的大门

在Linux下我们通过ldd 文件名来查看一个可执行程序所依赖的库
在这里插入图片描述
其中libc.so.6就是该可执行程序所依赖的库文件,通过命令ll -a,不难发现libc.so.6实际上是一个软链接。
gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证
在这里插入图片描述
通过上述的file 文件名命令,我们可以看到a.out这个可执行程序是动态链接的,用的是一个共享库,准确来说,还是一个动态库。

补充说明

  • 在Linux中,以.so为后缀的是动态库,以.a为后缀的是静态库。
  • 在Windows中,以.dll为后缀的是动态库,以.lib为后缀的是静态库。

这里的可执行程序所依赖的lib.so.6实际上就是C动态库,当我们去掉一个动静态库的前缀lib,再去掉后缀,剩下的就是这个库的名字,即c库。

注意Linux下gcc/g++编译器默认都是动态链接,若我们向静态链接,就要加上一个-static选项,命令以及运行结果如下图:
在这里插入图片描述
此时生成的可执行程序就是静态链接的,从命令的运行结果可以发现,静态链接生成的可执行程序大小比动态链接生成的可执行程序大小大很多。
在这里插入图片描述
在这里插入图片描述

我们用ldd mytest-s 想查看这个静态链接的程序所依赖的库,结果是无。所以静态链接所生成的可执行程序不依赖库,并且我们用file查看文件信息,结果显示它是静态链接的。

动静态库的特性

1.库分为静态库(专门让编译器,对用户程序进行静态链接的) 和 动态库(专门让编译器,对用户程序进行动态链接的)。

2.静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中我所需要的代码到我的可执行程序中。

3.动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中我所需要的代码的地址到我们自己的可执行程序中相关的位置。

4.静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行。

5.动态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序便无法运行!

6.静态库:因为自身的拷贝问题,比较浪费空间。

7.动态库:因为可以做到被大家共享方法,所以真正的函数实现永远都是在库中,程序内部只有地址,当程序需要时,在链接阶段直接通过地址进行跳转,跳转到动态库进行执行,执行完再回来,所以比较节省空间。

8.静态库vs动态库:Linux默认使用的是动态链接和动态库。

手动安装静态库

查看libc.a是否已经安装:

sudo find / -name 'libc.a'

安装静态库:

sudo yum install -y glibc-static

安装g++:

sudo yum install -y gcc-g++

安装c++静态库:

sudo yum install -y libstdc++-static

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/6297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HTML系列】第四章 · 列表和表格

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

【艾特淘】淘宝做爆款的目的是什么?怎么做?

其实在淘宝上面也有很多卖家都想要去打造属于自己店铺的爆款商品。 但是又不知道淘宝做爆款商品的目的是什么,也不知道爆款商品到底应该要怎么做,我马上就来给各位卖家介绍。 我们打造爆款是为了让我们通过爆款赚钱,通过爆款引来的流量带动其…

计算机| 关于CPU的12个知识点(图文详解)

CPU是什么? CPU与计算机的关系就相当于大脑和人的关系,它是一种小型的计算机芯片,通常嵌入在电脑的主板上。 CPU的构建是通过在单个计算机芯片上放置数十亿个微型晶体管来实现。 这些晶体管使它能够执行运行存储在系统内存中的程序所需的计…

JS手写浅拷贝与深拷贝

目录 1、引言 2、深拷贝与浅拷贝介绍 2.1、概念 2.2、实现方式 3、手写代码 1、引言 要了解浅拷贝与深拷贝,首先要知道 堆 和 栈 的概念 堆栈: 就是存放数据的地方(不管是定义的数字、字符串、对象还是数组、函数等等,都会在…

学习HM微博项目第10天

步骤:发微博12-表情键盘06-点击表情 -> 发微博13-表情键盘07-插入表情和封装textView -> 发微博14-表情键盘08-长按表情 -> 发微博15-表情键盘09-最近表情 -> 发微博16-表情键盘10-最近表情完善 发微博12-表情键盘06-点击表情 APP的演示动画&#xff…

完全自学C(干货) —— 预处理详解

目录 一,预定义符号 二,#define #define定义的标识符 #define定义宏 # ## 带副作用的宏参数 宏和函数的对比 #undef 三,命令行定义 四,条件编译 五,文件包含 #include 六,其他预处理指令 一&…

搞的谁还不会爬福利美女跳舞视频一样,用我这个方法非常简单。

大家好啊!经常听别人说爬虫玩的好,*****!其实没有这么恐怖,爬虫你一般都是采集公开的信息,所以不会像网络传言那样,大家只要遵守协议,不会出问题的。 话说学编程语言的应该都是男孩子哈&#xf…

不解释

(1)业务线下 VS 线上大陆 VS 全球整合-国际规则合规企业 VS 产业极速联动-社会化资源调度(2)手段P:人工预测 VS 时序预测D:管理者人工指派任务 VS 运筹学最优求解C:人工检查监督审批工作流 VS …

第十五章 镜像架构和规划 - 示例镜像架构和网络配置

文章目录第十五章 镜像架构和规划 - 示例镜像架构和网络配置示例镜像架构和网络配置在单个数据中心、机房或校园内镜像配置简单故障转移对具有 DR 的故障转移配对和报告 Ayncs 同构连接第十五章 镜像架构和规划 - 示例镜像架构和网络配置 示例镜像架构和网络配置 本节描述并说…

Python用re模块使用正则表达式

Python正则表达式是一种强大的工具,用于在字符串中查找和匹配特定模式的文本。在Python中,可以使用re模块来使用正则表达式。正则表达式是一种模式匹配语言,可以在文本中寻找特定模式的字符串。正则表达式可以用于验证输入,搜索和…

MYSQL——美团面试题

MYSQL——美团面试题 2023/3/27 美团二面 题目描述 Create table If Not Exists courses (student varchar(255), class varchar(255));insert into courses (student, class) values (A, Math); insert into courses (student, class) values (B, English); insert into co…

《C++那些事》之开启你的BenchMark项目

《C那些事》之开启你的BenchMark测试0.导语本节目标:完成一个BenchMark小项目!在平时开发中,如何测试自己的接口性能呢?C里面如何快速搭建一个BenchMark测试框架呢?本节将Step By Step开启BenchMark入门的第一课。1.项目结构我们以…

灵动微基于 MM32SPIN040C 为主控的无感方波水泵应用方案

水泵是一种运输液体或增压液体的机器。将原动机的机械能或其他外部动能量传递给液体,提高液体动能,主要用于运输含水、油、酸碱液、乳化液、悬乳液和液体金属的液体。 介绍一款适用于水泵的32位单片机——MM32SPIN040C。 RAMSUN推荐一款应用于水泵的MC…

从零开始实现一个C++高性能服务器框架----协程调度模块

此项目是根据sylar框架实现,是从零开始重写sylar,也是对sylar丰富与完善 项目地址:https://gitee.com/lzhiqiang1999/server-framework 简介 项目介绍:实现了一个基于协程的服务器框架,支持多线程、多协程协同调度&am…

倒计时组件:可视化如何自定义目标时间 / 数字倒数

倒计时组件支持通过自定义目标时间或倒数数字,在报表和大屏中展示时间倒数和数字倒数。 下面以Sugar BI为例,为大家展示 倒计时展示模式 倒计时组件提供「时间倒数」和「数字倒数」两种展示模式,效果如下: 默认为「时间倒数」模…

将本地项目上传到远程仓库的步骤

文章目录将本地项目上传到远程仓库的步骤1.进入想上传的项目文件夹2.初始化本地仓库3.添加该项目下的所有文件4.将文件添加到本地仓库中5.添加远程仓库6.将文件更新到远程仓库上7.将本地文件推送回到指定的远程仓库中将本地项目上传到远程仓库的步骤 1.进入想上传的项目文件夹…

简单介绍TensorFlow中关于tf.app.flags命令行参数解析模块

这篇文章主要介绍了TensorFlow中关于tf.app.flags命令行参数解析模块,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 tf.app.flags命令行参数解析模块 说道命令行参数解析,就不得不提到 python…

Spring的IOC和DI入门

1、相关概念 1.1、Spring来源 官网:Spring | Home Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架。Spring核心是IOC和AOP。 Spring主要优点包括: 方便解耦,简化开发,通过Spring提供的IoC容器,我们可以将…

分布式事务问题

分布式事务问题 1、什么是分布式事务 一次课程发布操作需要向数据库、redis、elasticsearch、MinIO写四份数据,这里存在分布式事务问题。 什么是分布式事务? 首先理解什么是本地事务? 平常我们在程序中通过spring去控制事务是利用数据库…

【C++】一维数组练习案例 - 五只小猪称体重

目录 1、缘起 2、案例描述 3、代码 4、总结 1、缘起 最近在黑马程序员 UP 主那里学习 C 编程语言,学习到了【第44节】一维数组练习案例 - 五只小猪称体重 知识点。找出五只小猪中最重的小猪,这不就是基本算法中的 "求最大值算法" 嘛。 为…
最新文章