老生常谈C语言动态函数库的制作和使用(推荐)

所属分类: 软件编程 / C 语言 阅读数: 62
收藏 0 赞 0 分享

>>>>>>老生常谈C语言接静态函数库的制作和使用>>点击进入

2 动态函数库的制作和使用

态函数库的制作步骤可以用下图来描述,具体包括

(1) 编写函数的.c文件(例如add.c、sub.c、mul.c和div.c)

(2) 编写Makefile,然后make,实现函数的编译和归档入库

函数的编译:使用gcc –c add.c -fPIC只编译不链接函数.c文件,分别生成函数的目标文件(例如add.o、sub.o、mul.o和div.o)。

函数的归档入库:使用gcc -o libdynamic.so $(objects) -share将目标文件归档入库。

(3) 编写头文件(例如kud.h),声明函数库中所有函数,目的是kudmain.c函数#include头文件后,可以调用相应的函数,至此,完成函数库的制作

2.1 动态函数库的制作示例

示例的内容建立动态函数库libdynamic.so,库中包括add、sub、mul和div函数,然后在kudmain.c函数中引用这4个函数,实现两个整数的加减乘除,整个文件的结构是

(1) 编写函数的.c文件

采用制作静态函数库时的4个函数文件add.c、sub.c、mul.c和div.c,不做任何改动。

(2) 编写头文件

将制作静态函数库时的头文件名ku.h改为kud.h,其他内容不做任何改动。

(3) 编写Makefile

由于制作动态库的命令和制作静态库的命令存在差异,因此需要修改Makefile。

objects = add.o sub.o mul.o div.o

libdynamic.so : $(objects)
  gcc -o libdynamic.so $(objects) -shared

add.o : add.c
  gcc -c add.c -fPIC

sub.o : sub.c
  gcc -c sub.c -fPIC

mul.o : mul.c
  gcc -c mul.c -fPIC

div.o : div.c
  gcc -c div.c -fPIC

clean : 
  rm libdynamic.so $(objects)

(4) 使用make编译.c文件,生成.o文件,归档.o文件到函数库libdynamic.so中,完成动态函数库的制作。

2.2 动态函数库的使用

(1)编写kudmain.c,调用libdynamic.so中的add、sub、mul和div函数

#include <stdio.h>
#include "kud.h" 

int main (void)
{
int a,b;
a = 10;
b = 3;
printf("a = %d.\nb = %d.\n",a,b);
printf("static a+b = %f.\n",add(a,b));
printf("static a-b = %f.\n",sub(a,b));
printf("static a*b = %f.\n",mul(a,b));
printf("static a/b = %f.\n",div(a,b));
return 0;
}

(2) 使用gcc kudmain.c –o kudmain.o –L ./ku2 –ldynamic 编译kudmain.c文件,运行./kudmain.o查看运行结果,结果出现ERROR,原因是程序运行load动态函数库时,找不到该函数库。

(3) 解决方法

方法1:将libdynamic.so放到/usr/lib目录下,执行cp kud2/libdynamic.so /usr/lib,然后运行./kudmain.o,程序运行正常,问题得到解决。

方法2:使用环境变量LD_LIBRARY_PATH,程序运行load动态函数库时,会先在LD_LIBRARY_PATH指定的目录下查找函数库,找不到就再去/usr/lib下查找,执行export LD_LIBRARY_PATH=/mnt/hgfs/winshare/kud/kud2:$LD_LIBRARY_PATH,然后运行./kudmain.o,程序运行正常,问题得到解决。

2.3 使用ldd命令查看依赖关系

ldd命令是一个shell脚本,不是一个可执行程序,用于查看某个可执行程序含有什么动态函数库,也即该程序执行时依赖于哪些动态函数库。

$ldd kudmain.o //可见kudmain.o依赖于libdynamic.so

以上这篇老生常谈C语言动态函数库的制作和使用(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

C++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多