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

>>>>>>老生常谈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语言math.h函数库、c语言函数库、c语言函数库 查询手册、c语言函数库大全、c语言数学函数库,以便于您获取更多的相关知识。

时间: 2024-11-08 18:26:22

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

C语言 动态内存分配的详解及实例_C 语言

1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名.     ①内存分配由编译器在编译期间决定     ②定义数组的时候必须指定数组长度     ③数组长度是在编译期就必须确定的 (3)但是程序运行的过程中,可能需要使用一些额外的内存空间 2. malloc 和 free 函数 (1)malloc 和 free 用于执行动态内存分配的释放 (2)malloc 所分配的是一块连续的内存 (3)malloc 以字节为单位,并且返回值不带任何的类型信息

c语言:基于函数指针的两个示例分析_C 语言

第一个:------------------------------------------------------ 复制代码 代码如下: #include <stdio.h>#include <string.h>void tell_me(int f(const char *, const char *));int main(void){   tell_me(strcmp);   tell_me(main);   return 0;}void tell_me(int f(const

C++中函数使用的基本知识学习教程_C 语言

函数是执行某种操作的代码块.函数可以选择性地定义使调用方可以将实参传递到函数中的输入形参.函数可以选择性地返回值作为输出.函数可用于在单个可重用块中封装常用操作(理想情况是使用可清晰地描述函数行为的名称).以下函数从调用方接受两个整数并返回其总和:a 和 b 是 int 类型的参数. int sum(int a, int b) { return a + b; } 可以从程序中任意数量的位置调用函数.传递给函数的值是实参,其类型必须与函数定义中的形参类型兼容. int main() { int i

C++虚函数及虚函数表简析_C 语言

C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态",这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,我在这里不做过多的阐述.大家可以看看相关的C++的书籍.在这篇文章中,我只想从虚函数的实现机制上面为大家 一个

C语言编程中借助pthreads库进行多线程编程的示例_C 语言

运行之前需要做一些配置: 1.下载PTHREAD的WINDOWS开发包 pthreads-w32-2-4-0-release.exe(任何一个版本均可)    http://sourceware.org/pthreads-win32/ ,解压到一个目录. 2.找到include和lib文件夹,下面分别把它们添加到VC++6.0的头文件路径和静态链接库路径下面:    a).Tools->Options,选择Directory页面,然后在Show directories for:中选择Includ

C++函数重载详解及实例代码_C 语言

C++函数的重载 定义 在同一个作用域中,函数名相同,函数的参数列表不同的函数之间构成重载关系,在不同作用域中的同名函数遵循标识符隐藏的原则 ATTENTION:重载与函数的返回值类型无关,因为声明一个函数不需要返回类型,所以无法用来区分哪个函数 常函数和普通成员函数之间构成重载,重载时常对象调用常成员函数,一般对象调用一般成员函数 class A{ - public: void getVal()const{-} void getVal(){-} }; int main(){ const A a

C语言函数的递归和调用实例分析_C 语言

一.基本内容: C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己. 要点: 1.C语言函数可以递归调用. 2.可以通过直接或间接两种方式调用.目前只讨论直接递归调用. 二.递归条件 采用递归方法来解决问题,必须符合以下三个条件: 1.可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减. 说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用. 2

关于C语言程序的内存分配的入门知识学习_C 语言

C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 代码段(Code or Text):代码段由程序中的机器码组成.在C语言中,程序语句进行编译后,形成机器代码.在执行程序的过程中,CPU的程序计数器指向代码段的每一条代码,并由处理器依次运行. 只读数据段(RO data):只读数据段是程序使用的一些不会被更改的数据,使用这些数方式类似查表式的操作,由于这些变量不需要更改,因此只需要放置

C语言中的内存泄露 怎样避免与检测_C 语言

有些程序并不需要管理它们的动态内存的使用.当需要内存时,它们简单地通过分配来获得,从来不用担心如何释放它.这类程序包括编译器和其他一些运行一段固定的(或有限的)时间然后终止的程序.当这种类型的程序终止时,所有内存会被自动回收.细心查验每块内存是否需要回收纯属浪费时间,因为它们不会再被使用. 其他程序的生存时间要长一点.有些工具如日历管理器.邮件工具以及操作系统本事经常需要数日及至数周连续运行,并需要管理动态内存的分配和回收.由于C语言通常并不使用垃圾回收器(自动确认并回收不再使用的内存块),这些