`
jiagou
  • 浏览: 2516651 次
文章分类
社区版块
存档分类
最新评论

Linux下的动态链接库.so文件的使用

 
阅读更多

参考文献:

http://blog.csdn.net/jenshy/article/details/674621

1 简介

大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐。那么,在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少。在/lib目录下,就有许多以.so作后缀的文件,这就是LINUX系统应用的动态链接库,只不过与WINDOWS叫法不同,它叫so,即Shared Object,共享对象。

2 如何创建动态链接库

生成动态链接库:

如:

gcc  -fpic -shared -o example.so  example1.c example2.c 
-fpic 使输出的对象模块是按照可重定位地址方式生成的。
-shared指定把对应的源文件生成对应的动态链接库文件libstr.so文件。

3 如何使用动态链接库

3.1 dlfcn.h头文件

Linux下使用动态链接库,源程序需要包含dlfcn.h头文件,此文件定义了调用动态链接库的函数的原型。下面详细说明一下这些函数。

3.1.1 dlerror

原型:

const char *dlerror(void);
作用:

当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。

3.1.2 dlopen

原型:

void *dlopen (const char *filename, int flag);
作用:

dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。

参数说明:

filename: so文件名.如果名字不以/开头,则非绝对路径名,将按下列先后顺序查找该文件。
(1) 用户环境变量中的LD_LIBRARY值;
(2) 动态链接缓冲文件/etc/ld.so.cache
(3) 目录/lib,/usr/lib.

flag:表示在什么时候解决未定义的符号(调用)。取值有两个:
1) RTLD_LAZY : 表明在动态链接库的函数代码执行时解决。
2) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号,一旦未解决,dlopen将返回错误。
dlopen调用失败时,将返回NULL值,否则返回的是操作句柄。

3.1.3 dlsym

原型:

void *dlsym(void *handle, char *symbol);
作用:

dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。由此地址,可以带参数执行相应的函数。

举例:

void handle =NULL;
void (*add)(int x,int y);

handle =dlopen("xxx.so",RTLD_LAZY);
if (!handler) {
    printf( "加载模块错误 %s\n", dlerror() );
 return;
}
add=dlsym(handle,"add"); 
if(add)
    add(89,369);
dlclose(handle);

3.1.4 dlclose

原型:

int dlclose (void *handle);
作用:

dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。


分享到:
评论

相关推荐

    linux创建和使用动态链接库.so文件

    linux创建和使用动态链接库.so文件

    Linux动态链接库.so文件的创建与使用

    Linux动态链接库.so文件的创建与使用

    FFmpeg Android armeabi-v7a arm64-v8a 动态链接库.so文件

    针对Android平台编译好的FFmpeg 3.4.5的动态链接库.so文件,包括armeabi-v7a arm64-v8a两个版本,包含头文件,包含x264,支持mediacodec硬解码h264,h265。可直接集成到工程中用于视频编辑、转码等。

    Linux环境下编译的TensorFlow C++ API动态库文件.7z

    1、TensorFlow C++ API的编译是线上使用TensorFlow C++ API调用预先训练好的模型完成预测项目的必经之路...2、Linux环境下编译TensorFlow C++ API生成的动态链接库:libtensorflow_cc.so,libtensorflow_framework.so。

    linux Qt 生成so库,与调用so库实例

    创建步聚:创建项目-》先lib选项,一直Next,根据实例写库,构建生成.so库。 调用:右键添加外部库-》修改pro文件-》添加头文件-》创建对象-》调用应库函数。

    Linux系统中动态链接库的创建及其使用

    编译函数源程序时选用-shared选项即可创建动态链接库,注意应以.so后缀命名,最好放到公用库目录(如/lib,/usr/lib等)下面,并要写好用户接口文件,以便其它用户共享。使用动态链接库,源程序中要包含dlfcn.h头文件,...

    linux静态库与动态库

    linux下面的库文件有两种:静态链接库(xx.a)和动态链接库(xx.so)。 当一个程序使用静态链 接库,那么当link的时候,连接器会把所需要的函数拷贝到源程序里面,这样,当编译完以后,静态链接库就可以不需要了。如果...

    linux动态链接库

    动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译...例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。

    linux下构建多目录下Makefile产生so动态库样例

    我的工作最近需要用到linux下构建多目录下Makefile产生so动态库样例的知识,我将最新的学习心得,做一个记录分享,以便以后需要使用时可以做参考。

    libcrypto.so.1.1

    openssl 加密算法的重要动态链接库,如果在调试某些含有DES SHA等加解密函数的程序报缺少libcrypto.so.*的错误时,可以使用这个库,然后添加软链接指向这个库文件就行。

    linux-x86-64.zip

    Tesseract4.0 centos7下动态链接库libtesseract.so ; 代码中放在resource目录下linux-x86-64文件之下

    Linux下动态连接.doc

    -> 在运行时与共享库(lib*.so)动态链接,通过动态链接装入器,将动态库映射进应用程序 的可执行内存中。在启动应用程序之前,动态链接器将所需的共享库映射到应用的内存, 或者使用系统共享的目标并为应用程序解析所...

    Linux操作系统下动态库的生成及链接方法

    Linux下动态库文件的扩展名为\".so\"(Shared Object)。按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号)。这样,线程函数库被称作libthread.so。静态库的文件名形式是libname.a。共享...

    libjnotify64.so

    jnotify 程序目录中的libjnotify.so是linux32操作系统中的动态链接库, 没有 linux 64操纵系统下 的动态链接库文件,这个是在网上淘到的分享给大家。libjnotify64.so

    linux下为SCTP创建动态链接库

    通过java实现SCTP通信时,需要编译SCTP的动态链接库 本资源描述了如何在linux上进行.so文件的编译过程

    编译ffmpeg生成的库文件,Android和Linux版本

    该库文件由FFmpeg4.2.2源码编译完成,里面包含linux版本的C/C++动态链接库和静态链接库,和Android版本的.so库文件(arm64-v8a和armeabi-v7a)

    Linux动态链接库的使用

    例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。 针对二进制文件有用的命令 查看文件类型 file 查看二进制文件链接到哪些库 ldd 查看二进制...

    Python在Windows和在Linux下调用动态链接库的教程

    Linux系统下调用动态库(.so) 1、linuxany.c代码如下: #include "stdio.h" void display(char* msg){ printf("%s\n",msg); } int add(int a,int b){ return a+b; } 2、编译c代码,最后生成Python可执行的....

    Java-Linux环境下OpenCV本机库文件

    在Windows操作系统下,本机库文件的扩展名通常是`.dll`(动态链接库),而在Linux操作系统下,本机库文件的扩展名通常是`.so`(共享对象)。这是由于不同操作系统使用不同的二进制格式和加载机制。 原因如下: 1. ...

Global site tag (gtag.js) - Google Analytics