Linux静态库和动态库
来源:互联网 发布:pp助手和淘宝手机助手 编辑:程序博客网 时间:2024/05/23 00:10
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
静态库和动态库的区别
1. 静态函数库
2. 动态函数库
linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。
静态库的使用
静态库的操作工具:gcc和ar 命令。
编写及使用静态库
(1)设计库源码 pr1.c 和 pr2.c
[root@billstone make_lib]# cat pr1.c
void print1()
{
}
[root@billstone make_lib]# cat pr2.c
void print2()
{
}
[bill@billstone make_lib]$ cc -O -c pr1.cpr2.c
[bill@billstone make_lib]$ ls -l pr*.o
-rw-rw-r--
-rw-rw-r--
(3)
[bill@billstone make_lib]$ ar -rsv libpr.a pr1.opr2.o
a - pr1.o
a - pr2.o
[bill@billstone make_lib]$ ls -l *.a
-rw-rw-r--
[bill@billstone make_lib]$ ar -t libpr.a
pr1.o
pr2.o
(4)
[bill@billstone make_lib]$ cat main.c
int main()
{
}
(5)
[bill@billstone make_lib]$ gcc -o main main.c -L./-lpr
[bill@billstone make_lib]$ ls -l main*
-rwxrwxr-x
-rw-rw-r--
(6)执行目标程序
[bill@billstone make_lib]$ ./main
This is the first lib src!
This is the second src lib!
[bill@billstone make_lib]$
动态库的使用
编写动态库
(1)设计库代码
[bill@billstone make_lib]$ cat pr1.c
int p = 2;
void print(){
}
[bill@billstonemake_lib]$
(2)生成动态库
[bill@billstone make_lib]$ gcc -O -fpic -shared -o dl.sopr1.c
[bill@billstone make_lib]$ ls -l *.so
-rwxrwxr-x
[bill@billstone make_lib]$
动态库的隐式调用
[bill@billstone make_lib]$ cat main.c
int main()
{
}
[bill@billstone make_lib]$ gcc -o tdl main.c./dl.so
[bill@billstone make_lib]$ ./tdl
This is the first dll src!
[bill@billstone make_lib]$
当动态库的位置活名字发生改变时,
动态库的显式调用
[bill@billstone make_lib]$ cat main.c
#include<dlfcn.h>
int main()
{
}
[bill@billstone make_lib]$ gcc -o tds main.c –ld1–L.
此时还不能立即./tds,因为在动态函数库使用时,会查找/usr/lib、/lib目录下的动态函数库,而此时我们生成的库不在里边。这个时候有好几种方法可以让他成功运行: 最直接最简单的方法就是把libstr_out.so拉到/usr/lib或/lib中去。还有一种方法 export LD_LIBRARY_PATH=$(pwd)另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig。/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib/lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig。另外还有个文件需要了解/etc/ld.so.cache,里面保存了常用的动态函数库,且会先把他们加载到内存中,因为内存的访问速度远远大于硬盘的访问速度,这样可以提高软件加载动态函数库的速度了。
库依赖的查看
使用ldd命令来查看执行文件依赖于哪些库。
该命令用于判断某个可执行的 binary 档案含有什么动态函式库。
[root@test root]# ldd [-vdr] [filename]
参数说明:
--version 打印ldd的版本号
-v --verbose 打印所有信息,例如包括符号的版本信息
-d --data-relocs 执行符号重部署,并报告缺少的目标对象(只对ELF格式适用)
-r --function-relocs 对目标对象和函数执行重新部署,并报告缺少的目标对象和函数(只对ELF格式适用)
--help 用法信息。
如果命令行中给定的库名字包含'/',这个程序的libc5版本将使用它作为库名字;否则它将在标准位置搜索库。运行一个当前目录下的共享库,加前缀"./"。
转自:http://www.cnblogs.com/feisky/archive/2010/03/09/1681996.html- linux库:静态库和动态库
- Linux动态库和静态库比较
- Linux创建静态库和动态库
- Linux中的静态库和动态库
- linux 下静态库和动态库
- linux中的动态库和静态库
- [Linux]链接,静态库和动态库
- LINUX 静态库和动态库
- linux静态库和动态库分析
- Linux静态库和动态库
- linux静态库和动态库
- linux生成动态库和静态库
- Linux静态库和动态库
- linux 动态库和静态库
- linux静态库和动态库分析
- Linux静态库和动态库
- linux中的动态库和静态库
- linux静态库和动态库分析
- hello world
- WPF中ListBox怎么双击只是双击里面的项而已,而不把其他空白的区域也双击!
- 一次Oracle Job编写
- 正常启动后发出嘀声响三次等
- linux 的库操作命令 ar和nm
- Linux静态库和动态库
- mono for android 配置安装以及小测试
- Linux 获取当前目录
- share
- 数字图像处理 边缘检测
- 两个OOM Cases排查过程的分享
- I,P,B帧和PTS,DTS的关系
- aspnetpager 排序
- 协议转换--Linux多路网络数据转多串口输出程序实现