Unix/Linux下静态函数库和动态函数库的制作及使用

静态函数库和动态函数库的制作及使用

程序在运行过程中,往往需要调用外部写好的函数库。函数库分为两种:静态函数库和动态函数库。

静态函数库:

静态函数库通常以.a为后缀。在编译的过程中,将函数库的二进制代码与程序代码编译在一起,成为程序中的一个部分。使用静态函数库的优点是能够提高程序的兼容性和执行效率。但缺点也同样明显,假如多个程序都是使用同一套函数库,那么由于其函数库的代码是程序的一部分,所以程序执行的时候会在内存中存在多份功能代码一致的静态函数库代码,这造成了内存空间的浪费。

动态函数库:

动态函数库通常以x.so.x命名,位于/usr/lib或/usr/local/lib文件夹下。动态函数库是在编译时指明了链接的函数信息,并不会将函数库的代码正真的编译在程序中。在程序执行时,程序会自动的寻找内存中是否存在对应的函数库,如果已经存在则直接使用;如果不存在则将函数库加载入内存中,然后调用。对比静态函数库,使用动态函数库的程序自身大小较小,并且即使多个进程使用同一套函数库在内存中也只需存在一份,多个进程共享这一份函数库。

静态函数库的制作与使用:

第一步:将库文件编译但不链接
gcc -c mylib.c -o mylib.o

第二步:打包成静态函数库
ar crs libmylib.a mylib.o

第三步:编译主程序并链接静态函数库
假设我们的静态函数库位于当前主程序目录的子目录lib下,那么链接的命令:
gcc main.c -L./lib -lmylib -o main

注意,使用静态函数库时,要正确包含其函数的头文件,否则编译会找不到函数声明。
经过上述步骤,我们就将一个静态函数库与主程序成功的链接在一个文件了。

动态函数库的制作与使用:

第一步:将库文件编译但不链接

gcc -c mylib.c -fPIC -o mylib.o


第二步:打包生成动态函数库文件

gcc -shared mylib.o -o libmylib.so


第三步:编译主程序并链接动态函数库

假设我们的动态函数库位于当前主程序目录的子目录lib下,那么链接的命令:

gcc main.c -L./lib -lmylib -o main

上面的编译方法,是隐式使用动态函数库,下面介绍如何显示的使用动态函数库。
显示使用动态函数库:
要想显示调用动态函数库,我们在编译程序时,要包含libld函数库。然后包含其头文件ldfcn.h。

下面是几个关键函数的介绍。

1. void *dlopen(const char *filename,int flags);
-filename:需要打开的函数库文件名,可以是相对路径,可以是绝对路径。
-flags:必要包含RTLD_LAZY、RTLD_NOW两个其中一个,第一个表示使用时在加载函数库,第二个表示马上加载函数库。
-return:返回打开文件的句柄,如果打开失败,则返回NULL

2. char *dlerror(void);
-return:如果dl操作成功,则返回NULL,否则返回错误信息的字符串。

3. void *dlsym(void *handle,const char *symbol);
-handle:已打开函数库的句柄
-symbol:需要使用的函数符号名
-return:返回函数的指针

4. int dlclose(void *hanble);
-return:返回0表示关闭句柄成功,其他 则关闭失败。

下面是一个使用这四个的示例代码:
#include <stdio.h>
#include <dlfcn.h>

int main()
{
	void *handle = NULL;
	int (*pfun)(int,int) = NULL;/*定义参数类型为int,int,返回值为int的函数指针*/
	handle = dlopen("./libmylib.so",RTLD_LAZY);/*打开动态函数库文件*/
	if(handle != NULL)
	{

	   pfun = dlsym(handle,"sub");/*获取对应符号的函数指针*/
	   if(dlerror() == NULL)
	   {
			printf("%d",pfun(10,20));/*调用动态函数库中的函数*/
			dlclose(handle);/*关闭文件句柄*/
	   }
	}
	else
	{
		printf("can not find so\n");
	}	

	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值