前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux】从零开始认识动静态库 -动态库

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

作者头像
叫我龙翔
发布2024-05-12 08:28:36
710
发布2024-05-12 08:28:36
举报

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

代码语言:javascript
复制
 1 # .bashrc                                                                                                                                                                     
  2 
  3 # Source global definitions
  4 if [ -f /etc/bashrc ]; then
  5   . /etc/bashrc
  6 fi
  7 
  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 functions
 12 alias vim='/home/jlx/.VimForCpp/nvim'
 13 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/.VimForCpp/vim/bundle/YCM.so/el7.x86_64

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

代码语言:javascript
复制
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在把头文件设置好,这样就建立了动态库!

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

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

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

下一篇文章见!!!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 建立动态库
  • 2 使用动态库
    • 2.1 小试牛刀
      • 2.2 配置动态库
        • 方法一(暴力解决)
        • 方法二(环境变量)
        • 方法三(初始化)
        • 方法四(配置文件)
    • 3 总结
    • Thanks♪(・ω・)ノ谢谢阅读!!!
    • 下一篇文章见!!!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档