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 共享库

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

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

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

Linux共享库路径配置

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

linux下添加共享库

问题:cannot open shared object file: No such file or directory failed  方法:作个链接放到/usr/lib里。 如: ln -s ...

linux共享库的使用

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

在linux中使用cmake构建共享库(动态链接库)

cmake是一种跨平台的构建工具。它可以生成各种平台支持的makefile和project文件。 在windows下,一般都是用visual studio来管理工程。 事实上,就本人来说,使用cmak...

C语言库——静态库、共享库

我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期的代码维护。我们可以把他们制作成相应的功能...

Linux下创建自己的共享库

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。Linux操作系统支持的函数库分为静态库和动态库,动态库又...

was加共享库

1.启动WPS,登录WPS控制台>环境>共享库,选在你发布应用所在的节点和服务器,新建或者在原有的共享库中加入wsdl4j-1.6.2.jar的路径,如:E:\IBM\lib\wsdl4j-1.6.2...

共享库的生成与使用

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

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