静态函数库的制作和使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态函数库的制作和使用相关的知识,希望对你有一定的参考价值。

C语言的函数库是多组经过验证的常用函数的集合,编写C语言程序时使用库函数,既可以提高程序运行效率,又可以提高编程质量,使用方法如#include 和#include。

根据使用库函数时,函数库加载时机的差异,将函数库分为静态函数库和动态函数库,具体差异是:C语言程序如果使用静态函数库的函数,那么整个函数库的代码都会和C语言程序一起编译成可执行代码,程序的体积会膨胀;如果使用动态函数库的函数,则C语言程序只会和函数库文件名以及函数名一起编译成可执行代码(不编译函数代码),运行时去查找函数库文件和函数体,程序的体积基本不变。

简单概括就是,静态函数库是“以空间换时间”,增加程序体积,减少运行时间,如果静态函数库发生改变,则整个程序必须重新编译,因为函数库被整合到了最终可执行代码中;动态函数库则是“以时间换空间”,增加运行时间,减少程序体积,如果动态函数库发生改变,程序无须重新编译,因为函数库没有整合到最终可执行代码中。

Linux中静态函数库表示为”libxxx.a”,windows中后缀名为”.lib”;Linux中动态函数库表示为”libxxx.so”,windows中后缀名为”.dll”。函数库中存放内容包括:(1)函数名称,(2)函数目标代码(二进制),(3)重定位信息(链接需要)等。

 

1 静态函数库的制作和使用

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

技术分享

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

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

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

函数的归档入库:使用ar -rc libxxx.a  $(objects) 将目标文件归档入库。

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

 

1.1 静态函数库的制作示例
     
示例的内容是建立静态函数库libstatic.a,库中包括addsubmuldiv函数,然后在kumain.c函数中引用这4个函数,实现两个整数的加减乘除,整个文件的结构是

技术分享 

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

      编写4个函数文件add.csub.cmul.cdiv.c

//  add.c 
float add(int a, int b)
{
 return (a+b);
} 

 

// sub.c 
float sub(int a, int b)
{
return (a-b);
} 

 

//  mul.c 
float mul(int a, int b)
{
return (a*b);
} 

 

//  div.c 
float div(int a, int b)
{
return (a/b);
} 

 

(2)  编写头文件

//  ku.h 
float add(int a, int b);
float sub(int a, int b);
float mul(int a, int b);
float div(int a, int b);

(3)  编写Makefile

###  Makefile for static func lib 
objects = add.o sub.o mul.o div.o
 
libstatic.a : $(objects)
     ar -rc libstatic.a $(objects)

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

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

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

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

clean : 
    rm libstatic.a $(objects) 

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

技术分享

 

1.2 静态函数库的使用

(1)    编写kumain.c,调用libstatic.a中的add、sub、mul和div函数

//  kumain.c 
#include <stdio.h>
#include "ku.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 kumain.c –o kumain.o –L ./ku2 –lstatic 编译kumain.c文件,运行./kumain.o查看运行结果,成功。

技术分享

 

以上是关于静态函数库的制作和使用的主要内容,如果未能解决你的问题,请参考以下文章

linux下静态库和动态库的制作

动态库和静态库的区别

静态库的制作和使用

linux动静态库

linux动静态库

IOS 静态库的和.framework制作