Linux系统共享库编程

俊taizidang

俊taizidang

2016-01-29 12:11

Linux系统共享库编程,Linux系统共享库编程

Linux系统共享库编程

作者:苏怀广

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

一、说明

  类似Windows系统中的动态链接库,Linux中也有相应的共享库用以支持代码的复用。Windows中为*.dll,而Linux中为*.so。下面详细介绍如何创建、使用Linux的共享库。

二、创建共享库

在mytestso.c文件中,代码如下:

#include <stdio.h#include <stdlib.hint GetMax(int a, int b){if (a = b)return a;return b;}int GetInt(char* psztxt){if (0 == psztxt)return -1;return atoi(psztxt);}      
然后使用下列命令进行编译:
gcc -fpic -shared mytestso.c -o mytestso.so

-fpic 使输出的对象模块是按照可重定位地址方式生成的

编译成功后,当前目录下有mytestso.so,此时已成功创建共享库mytestso.so。


三、使用共享库

  共享库中的函数可被主程序加载并执行,但是不必编译时链接到主程序的目标文件中。主程序使用共享库中的函数时,需要事先知道所包含的函数的名称(字符串),然后根据其名称获得该函数的起始地址(函数指针),然后即可使用该函数指针使用该函数。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

在mytest.c文件中,代码如下:

#include <dlfcn.h#include <stdio.hint main(int argc, char* argv[]){void* pdlhandle;char* pszerror;int (*GetMax)(int a, int b);int (*GetInt)(char* psztxt);int a, b;char* psztxt = "1024";// open mytestso.sopdlhandle = dlopen("./mytestso.so", RTLD_LAZY);pszerror = dlerror();if (0 != pszerror) {printf("%sn", pszerror);exit(1);}// get GetMax funcGetMax = dlsym(pdlhandle, "GetMax");pszerror = dlerror();if (0 != pszerror) {printf("%sn", pszerror);exit(1);}// get GetInt funcGetInt = dlsym(pdlhandle, "GetInt");pszerror = dlerror();if (0 != pszerror) {printf("%sn", pszerror);exit(1);}// call funa = 200;b = 600;printf("max=%dn", GetMax(a, b));printf("txt=%dn", GetInt(psztxt));// close mytestso.sodlclose(pdlhandle);}      
然后使用如下命令进行编译:

gcc mytest.c -ldl -o mytest

-ldl选项,表示生成的对象模块需要使用共享库

(1)dlopen()

第一个参数:指定共享库的名称,将会在下面位置查找指定的共享库。

-环境变量LD_LIBRARY_PATH列出的用分号间隔的所有目录。

-文件/etc/ld.so.cache中找到的库的列表,用ldconfig维护。

-目录usr/lib。

-目录/lib。

-当前目录。

第二个参数:指定如何打开共享库。

-RTLD_NOW:将共享库中的所有函数加载到内存

-RTLD_LAZY:会推后共享库中的函数的加载操作,直到调用dlsym()时方加载某函数

(2)dlsym()

调用dlsym时,利用dlopen()返回的共享库的phandle以及函数名称作为参数,返回要加载函数的入口地址。

(3)dlerror()

该函数用于检查调用共享库的相关函数出现的错误。


四、结束语

本文主要阐述了Linux系统使用共享库的编程问题,并通过一个简单的实例详细说明。

展开更多 50%)
分享

猜你喜欢

Linux系统共享库编程

C语言教程 C语言函数
Linux系统共享库编程

让多系统共享IE资源

windows 操作系统
让多系统共享IE资源

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

双系统或多系统共享windowsFonts文件夹

电脑入门
双系统或多系统共享windowsFonts文件夹

Win7系统和WinXP系统共享互访设置

电脑入门
Win7系统和WinXP系统共享互访设置

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Win8系统共享局域网文件教程

windows系统
Win8系统共享局域网文件教程

Windows和Linux系统共存完美解决方案

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Windows和Linux系统共存完美解决方案

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

JSP应用的安全问题

JSP应用的安全问题

Flash AS3.0教程:Papervision3D应用2——PV3D基本原理

Flash AS3.0教程:Papervision3D应用2——PV3D基本原理
下拉加载更多内容 ↓