静态/动态函数库设计,王明学learn

时间:2024-01-14 20:37:56

              静态/动态函数库设计

Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供。

两者区别:

静态/动态函数库设计,王明学learn

一、函数库分类

函数库按照链接方式可分为:

1.静态链接库

  对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件 (executable file)。程序 在运行 时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件 名为“libxxx.a”的形式。

  特点:程序所要用到的库函数代码在链接时全部被copy到程序中。

  缺点:如果有多个进程在内存中同时运行,并且使用了相同的库函数,那么就会有多份拷贝,这就是对空间的浪费。

2. 动态链接库

  把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是动态链接库(dynamic link library)技术。

二、函数库存放位置

  Linux应用程序使用的主要函数库均存放于/lib, /usr/lib目录下,其中采用*.so.*方式命名的是动态函数库,而以*.a方式命令的是静态函数库。

2.1静态库-编译选项

  1.Linux下进行链接时默认是链接动态库

  2.如果需要使用静态库,需要使用编译选项  -static

例:gcc –static test.c -o test

2.2制作静态库

  1. gcc –c mylib.c –o mylib.o

  2. ar cqs libmylib.a mylib.o

表示:

(1) 生成静态库的文件名是 libmylib.a

(2) c 表示无提示模式创建文件包

(3) q 表示在文件包尾加入 mylib.o

(4) s 强制重新生成文件包的符号表

  3. 将制作好的libmylib.a 复制到/usr/lib

2.3使用静态库-编译选项

-lname:

  GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则需要使用-l选项来显示地指明需要链接。

例:gcc test.c –lmylib -o test

  函数库命名时一般以lib开头libmylib.a但是使用-l链接时却不用加lib而是知己使用-lname

三、动态链接函数库

制作动态链接库:

1. gcc –c –fPIC mylib.c –o  mylib.o  //这里一定要加上-fPIC选项,不然下一步编译失败

2. gcc -shared –fPIC  mylib.o -o libmylib.so

  3. 将制作好的libmylib.so 复制到/usr/lib

-fpic 使输出的对象模块是按照可重定位地址方式生成的。-shared 指明产生动态链接库。

如果库是移植使用一定要注意使用和编译的时候系统位数一致,并且包含头文件定义要使用库的函数原型.在使用过程中将库复制到/usr/lib目录下面然后在编译可运行程序是-lmylib(-l是小写的L)就可,这里没有.so后缀。

如果将自己编译的.so文件存放到了其他的目录下面则可以通过-L来指定链接动态库的路径。比如gcc  wmx.c  -o  wmx  -L ./ -lmylib (动态库在当前目录下)