参考文献:
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文件的创建与使用
针对Android平台编译好的FFmpeg 3.4.5的动态链接库.so文件,包括armeabi-v7a arm64-v8a两个版本,包含头文件,包含x264,支持mediacodec硬解码h264,h265。可直接集成到工程中用于视频编辑、转码等。
1、TensorFlow C++ API的编译是线上使用TensorFlow C++ API调用预先训练好的模型完成预测项目的必经之路...2、Linux环境下编译TensorFlow C++ API生成的动态链接库:libtensorflow_cc.so,libtensorflow_framework.so。
创建步聚:创建项目-》先lib选项,一直Next,根据实例写库,构建生成.so库。 调用:右键添加外部库-》修改pro文件-》添加头文件-》创建对象-》调用应库函数。
编译函数源程序时选用-shared选项即可创建动态链接库,注意应以.so后缀命名,最好放到公用库目录(如/lib,/usr/lib等)下面,并要写好用户接口文件,以便其它用户共享。使用动态链接库,源程序中要包含dlfcn.h头文件,...
linux下面的库文件有两种:静态链接库(xx.a)和动态链接库(xx.so)。 当一个程序使用静态链 接库,那么当link的时候,连接器会把所需要的函数拷贝到源程序里面,这样,当编译完以后,静态链接库就可以不需要了。如果...
动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译...例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。
我的工作最近需要用到linux下构建多目录下Makefile产生so动态库样例的知识,我将最新的学习心得,做一个记录分享,以便以后需要使用时可以做参考。
openssl 加密算法的重要动态链接库,如果在调试某些含有DES SHA等加解密函数的程序报缺少libcrypto.so.*的错误时,可以使用这个库,然后添加软链接指向这个库文件就行。
Tesseract4.0 centos7下动态链接库libtesseract.so ; 代码中放在resource目录下linux-x86-64文件之下
-> 在运行时与共享库(lib*.so)动态链接,通过动态链接装入器,将动态库映射进应用程序 的可执行内存中。在启动应用程序之前,动态链接器将所需的共享库映射到应用的内存, 或者使用系统共享的目标并为应用程序解析所...
Linux下动态库文件的扩展名为\".so\"(Shared Object)。按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号)。这样,线程函数库被称作libthread.so。静态库的文件名形式是libname.a。共享...
jnotify 程序目录中的libjnotify.so是linux32操作系统中的动态链接库, 没有 linux 64操纵系统下 的动态链接库文件,这个是在网上淘到的分享给大家。libjnotify64.so
通过java实现SCTP通信时,需要编译SCTP的动态链接库 本资源描述了如何在linux上进行.so文件的编译过程
该库文件由FFmpeg4.2.2源码编译完成,里面包含linux版本的C/C++动态链接库和静态链接库,和Android版本的.so库文件(arm64-v8a和armeabi-v7a)
例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。 针对二进制文件有用的命令 查看文件类型 file 查看二进制文件链接到哪些库 ldd 查看二进制...
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可执行的....
在Windows操作系统下,本机库文件的扩展名通常是`.dll`(动态链接库),而在Linux操作系统下,本机库文件的扩展名通常是`.so`(共享对象)。这是由于不同操作系统使用不同的二进制格式和加载机制。 原因如下: 1. ...