Linux下的库文件分为动态库和静态库,都是二进制文件,动态库的后缀为.so,静态库的后缀为.a
静态库
静态库的命名规则:
lib + 静态库的名字 + .a
制作步骤:
1) 生成对应的.o文件 :
gcc -c xxx.c
2) 将生成的.o文件打包:
ar rcs xxx.a xxx.o
发布静态库
发布静态库就是要发布.a文件和对应的头文件,头文件提供了库文件的接口
示例:
我的文件夹下有一个sckutil.c的套接字库文件,现在将它打包,并使用它编译一下TCP客户端client.c
看一下生成文件的大小:
优缺点:
- 库里面的程序直接拷贝到应用程序中,发布应用程序时无需再发布库文件,但是会导致应用程序过大。如果一个系统多个应用程序都链接到相同的库文件,会导致一份代码多个拷贝的情况,浪费系统资源
- 无需动态链接,程序运行速度相对较快
动态库
静态库的命名规则:
lib + 动态库的名字 + .so
动态库的三种名称:
- soname,动态库的软链接名称,指向realname
- realname, 动态库的真实名称,带有版本号信息,如 libsckutil.so.xxx,xxx是版本号
- linkername,编译过程中使用的动态库的名称,如sckutil,linkername也是指向realname的,编译过程中使用-L指定动态库的位置,-l指定是哪个动态库
制作步骤:
1) 生成位置无关的.o文件 ,加-fPIC选项
gcc -fPIC -c xxx.c
2) 将生成的.o文件打包: -shared选项
gcc -shared -o libxxx.so xxx.o
示例:
可以看到,使用动态库之后文件的大小已经大大减少。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!