linux动态链接库和静态库的生成及使用

一个epoll.c源文件,需要经过预处理器,编译器,汇编器和链接器的处理后输出可执行目标文件,然后由加载器把可执行文件加载到内存中执行。预处理器执行头文件和宏定义的简单替换,而编译器和汇编器生成可重定位目标文件(包括共享目标文件),链接器生成可执行目标文件,生成一种格式为ELF(Executable and Linkable Format)的可执行和链接文件。通过执行linux下

readelf -a epoll

可以列出ELF文件的详细信息。在生成可执行目标文件的过程中,链接器需要对汇编器构造的符号表进行解析,把代码中的每个符号引用和确切的一个符号定义联系起来,并且将程序中可能需要的静态库链接在一起。在Linux系统中,静态库以一种存档的特殊文件格式存在,有一组可重定位的目标文件组成,以.a后缀标识。创建静态库的命令为:

ar rcs libepoll.a epoll.o

我们可以将常用的函数归档在一起,例如有的库就会被编译成静态库的形式提供给用户,在使用时,只需向下面这样引入即可:

gcc -o main -L/home/tmp/lib -lepoll.a

这样系统就会到上面-L指定的路径区寻找libepoll.a静态库。静态库是将库中的所有数据都拷贝到可执行文件中,并且如果静态库有了最新版本,我们必须显示的将程序与更新了的库重新链接。另外,对于静态库,每个链接到静态库的程序,都会有一份静态库的拷贝,这就使得程序的体积变大。于是共享库出现了,来弥补静态库的缺陷。

Linux中动态库是以.so结尾的文件,他们大量存在我我们系统库中,例如/usr/lib/中,共享库是在程序运行时被动态链接进来的,并且所有需要此动态库的程序共享内存中的这一份拷贝。这样每个程序的体积就相对以静态库链接而生成的可执行文件小很大,而且动态库更新后每次程序调用时会自动连接最新的版本,无需我们显示指定。通常我们使用的标准库函数都是以共享库的形式被我们默默的使用,我们可以用

ldd epoll

来查看程序依赖的所有动态库。动态库的生成语句为

gcc -share -fPIC -o libepoll.so epoll.c

-fPIC(position indepedence code)表示生成与位置无关的代码。如果.so文件不在系统默认的库搜索路径中,默认路径可以通过查看/etc/ld.so.conf了解,那么我们可以像前面链接静态库那样显示指定,也可以在/etc/ld.so.conf.d目录下,编辑一个

epoll.conf的文件,内容为epoll.so的路径,比如/home/linux/lib/,当然如果你直接在/etc/ld.so.conf中添加应该也是可以的,但是不推荐这样。

然后执行ldconfig即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值