【linux】动静态库的使用与制作

本章节是基础IO的的最后一个话题!!

浅谈一下动静态库:

我们有没有用过库?
答案是一定的,我们在使用printf,stl容器…等等函数都是在使用库,
不然的话我们在使用这些东西时,明明你自己没有实现,程序缺依然能执行呢?

都是因为库的存在!

既然知道了库的存在,那我们肯定要见一见。
在这里插入图片描述

ldd命令可以查看可执行程序依赖的库,=>后指的是库的路径。
显示一下库的命令,可以看到,这些都是我们的库。
在这里插入图片描述
那么知道的库的存在总得知道库的名字吧
Linux
动态库:.so
静态库:.a

windows
动态库:.dll
静态库:.lib

动静态库的制作与使用:

当然是要先制作再使用啦,突然想起来小学题找语病~

我们先来讲解静态库,因为他简单。
将会分为3个步骤来走

  1. 怎么办
  2. 是什么
  3. 怎么办

好吧,与平时的三段论有些不同,但是无伤大雅。

静态库:

怎么办:

怎么办也就是制作,这里我们将会一步一步的带着大家走,会由一个例子来体现。

假设现在我们有两个你自己实现的库。
在这里插入图片描述
其中math中有add方法;string中有strcmp方法。

再假设我们现在要给你的室友抄C语言作业(实现库函数并写出在main函数中展示),但是你不能把你的原码给她,否则就谈不清谁抄的谁了。
在这里插入图片描述

方法一:

于是我们选择将源文件编译形成的.o文件给他,
直接gcc -c目标文件即可生成同名.o文件,不知道为啥这样做的的可以点击gcc与g++的认识
在这里插入图片描述
之后我们将这两个.o文件与头文件给他。
因为头文件就相当于一个使用方法。

在这里插入图片描述
那么我们的室友就写了一个main函数。
在这里插入图片描述
进行编译:
在这里插入图片描述
结果:
在这里插入图片描述
但是这样太挫了,如果头文件,.o文件太多就容易出错。

从这里我们就可以初见端倪,库的本质就是将.o文件打包。

方法二:

我们将.o文件进行打包给你的室友:
但并不是zip,tgz等打包,而是ar
他是一个归档工具,这里我们不需要管,只知道他与库的打包关系密切即可。用到的选项为rc,rc表示(replace and create)。

在这里插入图片描述
为什么起这么一个名字,别忘了我们是在制作静态库,库真正的名字是去掉前缀与后缀,真正的名字是myc(我的C库)
于是我们将libmyc.a库给室友进行编译。
在这里插入图片描述
运行依旧正确。
在这里插入图片描述
但这样依旧太矬了,我们在实际应用时都不会采取这种方法。

方法三:

先构成一个目录,包含头文件与库文件。
在这里插入图片描述
再将这个目录给你的舍友
将目录中的内容安装到系统。

在这里插入图片描述
在这里插入图片描述
随后即可像正常库文件使用,但是有一个注意点,我们的gcc/g++只认识C/C++的标准库,而mylib.a可以理解为第三方库。
故需要告诉编译器我们要链接的库
在这里插入图片描述
但是这种方法会污染库,我们是10分有9分的不愿意的!
不要忘记卸载你安装的库哦!

方法四:

在当前目录直接使用:
在这里插入图片描述
-I是指定你的头文件路径,-L是指定你库所在路径,-l是链接所在路径库的名字。

至于为什么我们为什么不用指定头文件呢,因为我们在.c文件中已经包含了。

是什么:

本质是一堆.o文件的打包

为什么:

提高效率!

开始动态库之前还要再说一个东西,我们之前学习时,说静态库是使用-static才可以生成,但是为什么我们并没有使用也说是静态库呢?

gcc/g++默认是动态链接的,但是如果没有动态库就会勉强使用需要你静态库的部分,其他能使用动态库还是使用动态库。

加上-static是强制全部使用静态库。

动态库:

我们的静态库用到了ar进行对静态库的打包,那动态库需要什么命令?

我们已经说过,打包的本质就是.o文件的打包,那我们的动态库也是需要.o文件,可是这个有一些不一样,需要

答案是编译器自己就可以完成!因为动态库的比率甚至高达90%,使用的是非常频繁啊。

持续更新…

最近更新

  1. TCP协议是安全的吗?

    2024-04-29 07:02:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-29 07:02:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-29 07:02:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-29 07:02:05       20 阅读

热门阅读

  1. python代码实现KNN对鸢尾花的分类

    2024-04-29 07:02:05       13 阅读
  2. ROS常用命令详解

    2024-04-29 07:02:05       12 阅读
  3. json.loads()与json.dumps()区别

    2024-04-29 07:02:05       12 阅读
  4. k8s解析数据 -o=jsonpath=‘{}‘ 的使用

    2024-04-29 07:02:05       9 阅读
  5. Qt---枚举类型enum--->QString

    2024-04-29 07:02:05       13 阅读
  6. Github 2024-04-28 开源项目日报 Top10

    2024-04-29 07:02:05       12 阅读
  7. 大数据004-hadoop002-数据

    2024-04-29 07:02:05       12 阅读
  8. ubuntu查看libc版本

    2024-04-29 07:02:05       12 阅读
  9. Redis分布式锁学习

    2024-04-29 07:02:05       12 阅读