动态库.so(共享库)的制作和使用
动态库的制作
1.首先建立三个C文件以及相应的头文件
2. 现将.c文件编译成.o文件
gcc -fpic -c test1.c test2.c
3.将第2步编译的.o文件生成动态库
gcc -shared test1.o test2.o -o libtest.so
动态库的命名方式:libxxx.so
- lib:前缀,固定格式
- xxx:名称,自己确定
- .so: 后缀,固定格式
动态库的使用
1. 编译链接生成可执行文件test,其中“-L”指定库的存储路径,“-l”指定库的名称(不需要“lib”和扩展名“.so”),如果在库的存储路径有同名的动态库和静态库,gcc默认使用动态库
gcc test.c -o test -I ./ -L ./ -l test
2. 运行可执行文件test,出现找不到动态库的问题
3. 通过ldd(list dynamic dependencies)命令检查动态库依赖关系
程序启动之后,动态库会被动态加载到内存中,通过 ldd (list dynamicdependencies)命令检查动态库依赖关系。可以看到libtest.so动态库无法找到。
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段 ——> 环境变量LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib目录找到库文件后将其载入内存。
4. 解决动态库加载失败的问题
通过以下五种方法可以指定共享库的路径
- 临时修改Linux环境变量LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/动态库的绝对路径:$LD_LIBRARY_PATH
修改完临时变量,动态库加载成功,如下图:
- 用户层次上更改Linux环境变量
在用户目录下有.bashrc(该文件为隐藏文件)文件,在最后一行添加以上语句
sudo vim ~/.bashrc
在最后一行加入:export LD_LIBRARY_PATH=/动态库的绝对路径:$LD_LIBRARY_PATH
在终端还要通过如下命令才能使这个文件的修改生效:
source ~/.bashrc
- 修改系统级别环境变量
通过一下命令直接进入系统级别的配置文件。同样的,在最后一行增加和上面一样的代码
sudo vim /etc/profile
在最后一行加入:export LD_LIBRARY_PATH=/动态库的绝对路径:$LD_LIBRARY_PATH
在终端还要通过如下命令才能使这个文件的修改生效:
source /etc/profile
- 修改/etc/ld.so.cache文件列表
这个文件是一个二进制文件,无法直接修改,需要间接修改,即/ect/ld.so.conf文件。使用sudo打开这个文件,在最后一行增加需要加载的动态库的绝对路径的即可。
sudo vim /etc/ld.so.conf
在最后一行加入:export LD_LIBRARY_PATH=/动态库的绝对路径:$LD_LIBRARY_PATH
编辑完之后需要使之生效:
sudo ldconfig
动态库.so(共享库)的制作和使用相关推荐
- 动态库(共享库)的制作和使用
Linux下的动态库为lib*.so格式的二进制文件(目标文件),对应于Windows下的.dll格式的文件. (1)命名规则 lib+库名+.so (2)动态库的制作 1)生成与位置无关的代码(.o ...
- Linux动态加载共享库,Linux共享库的动态加载(附测试案例)
共享库的动态加载是指可以在程序运行的过程中去加载所需的共享库.常用于某些系统或者应用程序的自动升级. 在C语言的源程序动态加载共享库,需要调用一组特殊的函数,它们被声明于一个专门的头文件dlfcn.h ...
- C 语言编程 — 静态库、动态库和共享库
目录 文章目录 目录 文章目录 程序函数库 静态链接 创建静态库文件 动态链接 创建共享库文件 共享库文件的名字 共享库文件的存储路径 LD_LIBRARY_PATH 环境变量 ldconfig 指令 ...
- Linux基础——gcc编译、静态库与动态库(共享库)
Linux基础--gcc编译.静态库与动态库(共享库) https://blog.csdn.net/daidaihema/article/details/80902012 Linux基础--gcc编译 ...
- 静态库,共享库,动态库 elf格式的
3.2 使用 3.3 环境变量 3.4 创建共享库 3.5 安装与使用 3.6 兼容性 4.动态加载 4.1 dlopen() 4.2 dlerror() ...
- 在Linux平台上如何使用接静态库和共享库
1.Linux函数库介绍 函数库可以看做是事先编写的函数集合,它可以与主函数分离,从而增加程序开发的复用性.Linux中函数库可以有3种使用的形式:静态.共享和动态. 1) 静态库的代 ...
- 静态库和共享库之间的区别?
静态库和共享库有什么区别? 我使用Eclipse,并且有几种项目类型,包括"静态库"和"共享库"? 一个人比另一个人有优势吗? #1楼 对于静态库,链接器从库中 ...
- linux系统中 库分为静态库和,你知道linux 静态库和共享库?
1.静态库和共享库 静态库和共享库(动态库),二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可执行程序运行时才载入内存的,在编译 ...
- UNIX再学习 -- 静态库与共享库
一.库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于Windows和linux本质不同,因此二者库的二进制是不兼容的.库有两种:静态库(.a..lib)和共享库也称动态库 ...
- 【转】Linux 静态库与共享库的使用
原文网址:http://blog.csdn.net/heyabo/article/details/11688517 申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链 ...
最新文章
- 【FFmpeg】RTSP、RTMP相关命令及开源项目
- sharepoint2010 SP1 chrome 时常无滚动条
- VB.NET通讯录源代码
- http的请求方法 GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE 说明
- SAP Spartacus 成功读取 Cart 之后,如何将 payload 插入全局 state
- 如何动态的向数组中插入键值对_在Java中实现的一个简单“HashMap”
- PHP里10个鲜为人知但却非常有用的函数
- WdatePicker 设置日期第一个比第二个的日期小
- ICLR 2020 | Bengio 一作论文:因果机制、元学习与模型泛化如何产生关联?
- 设计灵感|网页建议页面(联系页面)版式案例
- JavaScriptCore框架在iOS7中的对象交互和管理
- html属性是dom属性吗,HTML DOM 属性 对象
- 手机腾讯视频离线缓存ts格式文件合并为完整视频
- 阿里云API-python脚本开发-云监控数据对接nightingale监控
- 秃如其来第一步之安装JDK
- Typescript+Vue大型后台管理系统实战
- 1055 集体照 (25 分)(详解)
- sprintf() 格式化输出函数
- cat: `/user/tmp/hello.txt': No such file or directory解决办法
- Android手机无法使用google地图的问题的解决方案