送给大家一句话:
我不要你风生虎啸,
我愿你老来无事饱加餐。
– 梁实秋 《我把活着欢喜过了》
ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚
ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚
ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚
动态库
- 1 建立动态库
- 2 使用动态库
- 2.1 小试牛刀
- 2.2 配置动态库
- 方法一(暴力解决)
- 方法二(环境变量)
- 方法三(初始化)
- 方法四(配置文件)
- 3 总结
- Thanks♪(・ω・)ノ谢谢阅读!!!
- 下一篇文章见!!!
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 2 3 # Source global definitions4 if [ -f /etc/bashrc ]; then5 . /etc/bashrc6 fi7 8 # Uncomment the following line if you don't like systemctl's auto-paging feature:9 # export SYSTEMD_PAGER=10 11 # User specific aliases and functions12 alias vim='/home/jlx/.VimForCpp/nvim'13 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
我们加入对应的路径就可以了:
13 export LD_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
在把头文件设置好,这样就建立了动态库!
我们列举一下使用动态库的方法
- 直接安装到系统中
/lib64/
(或者建立软连接) - 命令行修改环境变量
- 修改环境变量初始化脚本文件
.bashrc
- 增添配置文件