Linux下共享库的创建和使用示例

原创 2015年07月08日 16:35:42

动态链接库是一种代码共享形式,便于模块化的开发与扩展。作为开发人员有必要详细了解其过程。


动态链接库的使用过程主要涉及到两个部分:

1.动态链接器 ld.so

2.ldconfig

其中:

ld.so负责加载应用程序所需的soname对应的共享库

ldconfig负责维护soname到实际共享库的链接的高速缓冲文件

高速缓冲文件中维护的链接关系被ld.so在加载时进行使用。


动态库的创建过程如下:

先描述一下创建过程中用到的几个名字:

动态库实际名字:

形如:

libexample.so.1.2.3

其中example是用于辨识库的主要部分,用于gcc的-l选项之后:gcc -lexample。

1为major number,主版本号,不同的主版本号之间不要求兼容性。

2为minor number,次版本号,较大的次版本号需要保证向后兼容,因此一般用于追加新接口。

3为patch number,又称发行号,release number,用于bugfix。

soname:

形如:

libexample.so.1

包括主版本号,主要用于写入共享库头中以供链接器写入应用程序,并用于在ld.so加载动态库时查找高速缓冲文件。

动态库链接名字:

libexample.so

用于链接器在链接过程中查找动态库。


示例:

示例过程简要描述:

创建一个简单的共享库libcalc.so

创建一个应用程序调用libcalc.so


libcalc.so的源码如下:

calc.h头文件(包含函数声明):

int add(int,int);
int minus(int,int);

calc.c 源文件(函数的实现):

int add(int a,int b) {
    return a+b;
}

int minus(int a,int b) {
    return a-b;
}

应用程序源码如下:

main.c:

#include <stdio.h>
#include "calc.h"

int main() {
    printf("%d %d\n",add(5,3),minus(5,3));
    return 0;
}

创建共享库:

1.文件列表:


2.编译可加载到任何地址的代码,注意选项-fPIC


3.链接生成共享库,注意-shared与-Wl,-Wl负责把-soname libcalc.so.1传递给实际完成工作的链接器。


4.生成两个符号链接,libcalc.so.1用于ld.so查找动态链接库并加载,libcalc.so用于链接器编译应用程序时查找符号。


5.链接生成应用程序,注意各选项。


6.尝试执行生成的应用程序,应该是无法找到共享库的,注意这里报的名字是libcalc.so.1,是libcalc.so.1.0.0的soname,并非链接时使用的libcalc.so,也不是libcalc.so指向的库文件名。


7.用根用户权限修改一下ld.so查找时的路径配置,默认情况下在/etc/ld.so.conf,此处可以修改ld.so.conf.d目录下的内容,为了便利就直接修改该配置文件了。


8.修改后的配置文件


9.使用ldconfig更新高速缓存文件,注意由于之前写的当前文件,则需在共享库所在目录下执行ldconfig,退出根用户,执行应用程序,结果成功。


10.最后不要忘了将ld.so.conf还原。

linux共享库的使用

前面我介绍了*.so文件的编译和生成。      但对绝大多数的程序员,绝大多数时候来讲,我们更多的使用现有的共享库。例如上一节我们做好的:libtest.so。      共享库的使用有2钟方式...
  • acs713
  • acs713
  • 2013年02月06日 17:14
  • 2937

Linux中的静态库、动态共享库和可加载库

这篇教程将讨论 Linux 库以及创建和使用 C/C++ 共享组件库和插件库背后的理论和哲学,同样也讨论了他们应用程序中使用的各种不同的技术和方法。这篇教程中所有的库均使用 GNU Linux 编译...
  • imxiangzi
  • imxiangzi
  • 2015年05月20日 16:03
  • 3296

linux 共享库

Linux下的共享库类似windows下的dll,共命令约定如下:静态库一般由字母 lib 开头,并有 .a 的扩展名,而共享对象有两个不同的名称:soname 和 real name。soname ...
  • feimashenhua
  • feimashenhua
  • 2011年03月16日 10:33
  • 1493

Linux共享库路径配置

Linux共享库路径配置   Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libnet,mysql),编译连接可以正常进行,但是在运行时出现如“error while loadi...
  • yanxiangtianji
  • yanxiangtianji
  • 2012年12月18日 22:27
  • 13932

Linux之共享库封装、使用的典型demo

## 目录结构 main.cpp device.h lib |  ev | libdevice.so      |  hw | libdevice.so       |  kt | libd...
  • sauphy
  • sauphy
  • 2015年12月16日 20:11
  • 687

Linux下共享库路径配置问题

http://blog.csdn.net/ldong2007/article/details/3227214   1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.co...
  • yangruibao
  • yangruibao
  • 2012年03月02日 18:19
  • 3724

linux下编译动态链接库的一个小例子

最近在项目中需要编译一个库,但是对linux
  • qianchenglenger
  • qianchenglenger
  • 2014年06月19日 19:44
  • 6934

linux共享库的编译

linux下的库有两种:静态库和共享库。共享库,一般也被称为动态链接库。        静态库的代码在编译过程中已经被载入可执行程序,因此体积较大,一般以libxxxx.a形式存在。       共享...
  • acs713
  • acs713
  • 2013年02月06日 16:48
  • 3017

linux C/C++之库编译静态库、共享库

C语言库——静态库、共享库 来源:顶嵌       我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码...
  • neiloid
  • neiloid
  • 2011年11月09日 00:26
  • 4182

共享库的生成与使用

=共享库的生成与使用= abstract:总结共享库的使用方法 tag:SharedLibrary so SharedObject soname readelf ldd [参考资料] ...
  • oney139
  • oney139
  • 2012年08月08日 21:34
  • 2120
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下共享库的创建和使用示例
举报原因:
原因补充:

(最多只允许输入30个字)