Linux系统共享库编程

2016-01-29 12:11 3 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

Linux系统共享库编程

作者:苏怀广

一、说明

  类似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://www.tulaoshi.com)

在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:将共享库中的所有函数加载到内存

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

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

(2)dlsym()

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

(3)dlerror()

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


四、结束语

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

来源:http://www.tulaoshi.com/n/20160129/1485013.html

延伸阅读
标签: windows 操作系统
  "Internet连接共享",曾出现在Windows 98(SE)/Me/2000的功能,现在在Windows XP中得以完善和增强,它让局域网内的多台PC,通过其中一台已与Internet连接的PC来连接Internet,从而达到多台PC共享一条Internet连接线路上网的目的,并提供防火墙的保护。 由于实现共享上网的网络结构有很多种,不能一一列举,所以在此选取了两...
标签: windows10
解决Win10系统无法访问XP系统共享打印机的方法   打印机共享,也就是平常说的局域网内的网络打印机。只要局域网中的一台电脑链接了打印机,我们就能够让所有用户通过局域网链接电脑,其他用户只需要添加一下网络打印机,就可以直接打印东西了。不过在局域网下的系统并非是统一的,当然有win10、xp等系统,不过有部分使用Win10访问WinX...
Win7系统无法连接XP系统共享打印机的解决办法   虽然还有不到100天XP系统就要光荣退役了,但是目前很多办公电脑安装的系统仍然是XP系统。在办公环境中,就会涉及到共享打印机的问题。下面图老师小编为大家介绍一下Win7系统无法连接XP系统共享打印机的解决办法。 当Win7系统电脑去使用一台挂接在XP系统电脑上的打印机时,可能会出...
标签: 电脑入门
开启的服务 右键点击我的电脑或计算机管理----服务和应用程序,打开服务或者用WIN+R打开运行---输入services.msc回车,打开服务设置 将以下服务的[启动类型]选为[自动],并确保[服务状态]为[已启动] Server Workstation Computer Browser DHCP Client Remote Procedure Call Remote Procedure Call (RPC) Locator DNS Client Functio...
标签: 服务器
linux中断编程&.amp   1.中断可以随时的打断处理机对其他程序的执行,如果被打断的代码对系统很重要,那么此时中断处理程序的执行时间应该是越短越好。 2.通过上文我们知道,中断处理程序正在执行时,会屏蔽同条中断线上的中断请求;而更严重的是,如果设置了IRQF_DISABLED,那么该中断服务程序执行是会屏蔽所有其他的中断请求。...

经验教程

320

收藏

7
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部