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 协议 ,转载请注明出处!

makefile基础 上一篇
IPC小工具 下一篇