动态库静态库
库文件:一般指第三方提供的可调用的库函数文件,库文件封存的是函数体,即.c文件里面的内容。
动态库 静态库
Windows下: xx.dll xx.lib
Linux 下: xx.so xx.a
静态库和动态库都是已经编译好的目标文件
静态库:在应用程序编译链接的时候,用到库函数的地方,会从静态库把函数体(二进制文件)拷贝到应用程序的调用处,运行时和静态库没关系。
动态库:在运行程序编译链接时,在调用库函数的地方做标记,在程序运行时会动态的去调用动态库中的函数体。
一、创建静态库
1.准备库函数源文件xxx.c yyy.c xxx.h
2.把源文件编译成目标文件 gcc -c xxx.c -o xxx.o
gcc -c yyy.c -o yyy.o
3.生成静态库文件
ar -r libxxx.a xxx.o yyy.o
4.使用静态库
5.编写应用程序源文件
zzz.c
6.编译应用程序
如果直接加在系统路径下(/lib),-L这个从参数就不用加了。
gcc zzz.c -lxxx -L./ -o zzz
-l //指定用到的库文件
-L //指定库文件存放的路径
7.运行
./zzz
二、动态库
1.创建动态库
- 编写库的源文件 xxx.c yyy.c
- 编译成目标文件 gcc -c xxx.c -fpic -o xxx.o | gcc -c yyy.c -fpic -o yyy.o
- 生成动态库 gcc -shared xxx.o yyy.o -o libxx.so
2.使用动态库
- 编写应用程序 main.c
- 编译应用程序 gcc main.c -lxx -L./ -o main
- 运行
方式一:
LIBRARY_PATH //记录编译时动态或静态库的系统路径
LD_LIBRARY_PATH //记录程序运行时动态库路径
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
方式二:
把动态库复制到/usr/lib 中
把头文件复制到/usr/include中
三、各自优缺点
优缺点:静态库相比动态库代码量大,但是它容易部署。
动态库则相反,但动态库还容易维护和升级。