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

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。可直接集成到工程中用于视频编辑、转码等。

    编译ffmpeg(ffmpeg6.0+android-ndk-r25c)生成的动态链接库.so文件

    针对Android平台编译好的FFmpeg 6.0的动态链接库.so文件,包括armeabi-v7a ,arm64-v8a两个版本.

    linux下如何生成使用静态和动态链接库

    Linux 下静态和动态链接库的生成与使用 Linux 操作系统中,链接库是指一组预先编译好的二进制代码,提供给其他程序使用。链接库可以分为静态链接库和动态链接库两种,下面将详细介绍如何生成和使用这两种链接库。 ...

    LINUX下简单的编译和使用动态链接库

    LINUX 下简单的编译和使用动态链接库 在 LINUX 下,编译和使用动态链接库是一项非常重要的技术。动态链接库,即 Shared Object(.so 文件),是将一些常用的代码,例如函数、类等,编译成一个独立的文件,供其他...

    QNX系统中添加自己编译的.so库.zip_QNX .so文件_SO打包_qnx文件_qnx系统g++编译_so库

    将自己编译生成的动态链接库文件打包到QNX系统中,主要修改的是打包所依赖的build配置文件

    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头文件,...

    arm64下的libopencv*.so+libopencv*.so.3.2文件

    arm64环境下的opencv3.2的所有动态链接库文件打包合集,快速开发可以不用安装opencv,直接拷贝这些库文件,cmake指定路径可用。

    linux动态链接库

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

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

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

    C语言动态库SO.pdf

    在Linux和其他使用gcc编译器的Unix系统中,可以使用gcc的“-fpic”选项编译PIC型.o文件,使用“-shared”选项链接动态库。 动态库的优点是可以支持二进制文件接口,例如连接libc时一般都使用.so而不是.a,这样程序...

    linux-x86-64.zip

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

    libcrypto.so.1.1

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

    linux静态库与动态库

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

    Linux下动态连接.doc

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

    在Delphi for Linux中应用共享对象库.pdf

    在Linux平台上,共享对象库(SO)是一种特殊类型的动态链接库(DLL),它可以在多个应用程序之间共享代码和数据。SO库文件通常以.so为后缀名,例如libmath.so。 二、SO库文件的组成 SO库文件通常由多个目标文件(....

    Linux操作系统下常见文件类型分析

    Linux 操作系统下常见文件类型...* .so 文件:动态链接库文件。 * .tcl 文件:TCL 脚本文件。 了解 Linux 操作系统下常见文件类型的特点和使用方法,可以帮助用户更好地管理和使用文件资源,提高工作效率和生产力。

Global site tag (gtag.js) - Google Analytics