函数库存放位置:
linux应用程序使用的主要函数均放在/lib和/usr/lib目录下,其中采用*.so.*命名的是动态函数库,而以*.a方式命名的是静态函数库。
静态函数库的特点:
* 程序所要用到的库函数代码在链接时全部被copy到程序中。
* 导致的问题:如果有多个进程在内存中同时运行,并且使用了相同的函数库,那么就会有多份拷贝,造成了空间的浪费。
使用静态库-编译选项
1. linux下进行链接时,默认采用的是动态链接
gcc test.c -o test
readelf -d test
可以看到Shared library: [libc.so.6]为动态库
2. 如果需要使用静态库,需要加入编译选项 -static ,例如:
gcc -static test.c -o test
RHEL6默认不提供静态函数库,因此需要手动安装
rpm -ivh glibc-static-2.12-1.80.el6.i686.rpm
制作静态库
1. gcc -c mylib.c -o mylib.o
2. ar cqs libmylib.a mylib.o
3. 复制libmylib.a到/usr/lib
GCC在链接时,默认只会链接到C函数库,而对于其它的函数库,需要使用-l选项来显示的指明,例如:
gcc test.c -lmylib -o test /*函数库为libmylib.a*/
制作动态库
1. gcc -c mylib.c -o mylib.o
2. gcc -shared -fPIC mylib.o -o libmylib.so
3. 将制作好的libmylib.so复制到/usr/lib下
-fPIC 使输出的对象模型是按照可重定位地址方式生成的
-shared指明产生动态链接库
-c只编译不链接