0


【Linux】从零开始认识动静态库 -动态库

在这里插入图片描述
送给大家一句话:
我不要你风生虎啸,
我愿你老来无事饱加餐。
– 梁实秋 《我把活着欢喜过了》

ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚
ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚
ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚


动态库

1 建立动态库

下面我们再提一个选项:

  • -fPIC : 产生位置无关码(动态库里非常重要)

使用一下: 在这里插入图片描述
因为动态库使用的非常频繁,所以

gcc

就给我们提供了形成动态库的方法。
在这里插入图片描述
这里出现了

main

函数的报错。因为代码中没有

main

函数,就不可能形成可执行程序!

所以我们需要加上

-shared

选项!!!
在这里插入图片描述
于是我们就形成了动态库!!!
把动态库一起打包到

mylib

里,可以让用户自行选择使用

2 使用动态库

2.1 小试牛刀

刚才我们已经在

mylib

下建立动态库,接下来就来看看如何使用吧:
这是gcc的选项:

  • -I(大写 i) :可以帮助程序员动态的加入头文件的搜索路径
  • -L :可以帮助程序员动态加入需要链接的库文件的搜索路径
  • -l(小写 L ):指明需要链接的库

在这里插入图片描述

直接

gcc

编译肯定是不可以的,报错说找不到库,那么我们就加上

-I

选项:
在这里插入图片描述
现在提醒我们是找不到函数的实现,找不到那我们就给他加上呗,使用

-L

选项加入库的搜索路径,然后指明使用的库文件:
在这里插入图片描述
现在好了,我们运行试试奥:
在这里插入图片描述

啊??? 什么情况???明明声明了啊,怎么还链接不上啊!
那应该怎么做呢?我们需要进行一些配置,就可以平滑的使用动态库了!

2.2 配置动态库

分析一下问题:

gcc test.c -I mylib/include/ -L mylib/lib/ -lmyc

命令只是将需要使用的动态库刚告诉给了

gcc

编译器,并没有告诉操作系统!!!

  • 动态库在程序运行的时候,要找到对应的动态库加载并运行(所以要告诉操作系统)
  • 静态库就不需要,因为编译的时候就把库中的代码拷贝到了可执行程序内部了!加载就和库没有关系了!

那怎么才能让操作系统明白呢?

方法一(暴力解决)

我们来看一个目录

/lib64/


在这里插入图片描述
这里面有许多的动态库,所以为了让操作系统可以找到我们的库,我们可以直接将我们的库放到这个目录下:
拷贝到这里就可以了:
在这里插入图片描述

这样就成链接到了,我们不进行重新编译就要可以正常运行,说明动态库与可执行文件处于一种松耦合的状态!

我们也可以在

/lib64/

下建立一个软链接:
在这里插入图片描述
这样也是同样的效果,我们可以正常运行我们的可执行程序!!!

这个方法虽然简单,但是操作系统的文件可不兴改奥!!!所以我们接下来再来看看其他方法:

方法二(环境变量)

我们之前学习过环境变量,关于动态库的搜索路径也有一个变量:
在这里插入图片描述
这个变量里就存放着动态库的加载路径,我们只需要把我们的库路径加入进去就可以了

在这里插入图片描述

这样我们的可执行程序也就可以正常链接了:
在这里插入图片描述
但是这还是会有一个弊端,环境变量会在每次重启对话的时候初始化,会刷新掉我们的数据,所以为了保证不需要每次都修改环境变量,所以我们就来看看

方法三(初始化)

我们学习环境变量的时候,提到过我们的用户家目录会有几个脚本文件:
在这里插入图片描述
我们打开

.bashrc
1# .bashrc                                                                                                                                                                     23# Source global definitions4if[-f /etc/bashrc ];then5. /etc/bashrc
  6fi78# Uncomment the following line if you don't like systemctl's auto-paging feature:9# export SYSTEMD_PAGER=1011# User specific aliases and functions12aliasvim='/home/jlx/.VimForCpp/nvim'13exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/.VimForCpp/vim/bundle/YCM.so/el7.x86_64

我们加入对应的路径就可以了:

13exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/.VimForCpp/vim/bundle/YCM.so/el7.x86_64:/home/jlx/lesson22/roommate/mylib/lib

这样每次启动会话的时候,就可以链接到我们的动态库了!!!
这个方法终归是像“为了一碟醋,包了顿饺子”,因为如果这个动态库很重要,那就直接放到

/lib64/

下不就好了;如果不重要,那就不要把环境变量改来改去(没准会引发问题)

方法四(配置文件)

除了上述的方法我们还有其他办法哦:
比如在这个路径下:
在这里插入图片描述
有这些配置文件,而我们要做到就是吧把我们的动态库的路径加入到配置文件中。

因为这些文件都是

root

的,所以操作时要注意权限!
首先我们要在

/etc/ld.so.conf.d

创建一个

.conf

配置文件
在这里插入图片描述
在文件中写入我们的路径:

/home/jlx/lesson22/roommate/mylib/lib

然后使用命令

ldconfig

让配置文件生效就可以了
这样就可以了!!!

3 总结

建立动态库的前提是

.o

文件带有位置无关码:

  • -fPIC : 产生位置无关码(动态库里非常重要)
  • 命令:gcc -fPIC -c 文件名

打包过程直接使用gcc:

gcc -shared -o 文件名 -o lib库名.so

在把头文件设置好,这样就建立了动态库!

我们列举一下使用动态库的方法

  1. 直接安装到系统中/lib64/(或者建立软连接)
  2. 命令行修改环境变量
  3. 修改环境变量初始化脚本文件.bashrc
  4. 增添配置文件

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/JLX_1/article/details/138684481
版权归原作者 叫我龙翔 所有, 如有侵权,请联系我们删除。

“【Linux】从零开始认识动静态库 -动态库”的评论:

还没有评论