静态/动态函数库设计
Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供。
两者区别:
一、函数库分类
函数库按照链接方式可分为:
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 (动态库在当前目录下)