静态库与动态库
静态函数库一般扩展名为.a或.lib,这类的函数库通常名为libxxx.a或xxx.lib。这类库在编译的时候会直接整合到目标程序中,所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不再需要向外部要求读取函数库的内容,但升级时如果函数库更新则需要重新编译。
动态函数库的扩展名一般为.so或.dll,这类函数库通常名为libxxx.so或xxx.dll 。与静态函数库被整个编译到程序中不同,动态函数库只有当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用,也就是说可执行文件无法单独运行,这样方便升级,只要替换对应动态库即可,不必重新编译整个可执行文件。
静态库和动态库最本质的区别就是加载的时机,静态库在编译阶段就会加载到可执行文件中,而动态库会在执行阶段加载到可执行文件中。
操作步骤
- 编写静态库函数sta_fun.c、动态库函数dyn_fun.c、主函数main.c以及所需头文件
- 静态库的制作
gcc -c xxx.c #将目标源文件xxx.c编译成目标文件xxx.o
ar -rcs libxxx.a xxx.o #使用ar工具制作静态库libxxx.a
- 动态库的制作
gcc -shared -fPIC -o libxxx.so xxx.c #制作动态库libxxx.so
- 库的使用
gcc main.c -lxxx -L./dir/ #-l指定加载哪个库,-L指定加载的库文件的存放路径,dir就是libxxx.a文件的存放路径,默认只加载/usr/lib/中的库
gcc main.c ./dir/libxxx.so -o main #使用动态库libxxx.so
我这里将两个库同时使用,这样对于bat这文件夹来说,在不知道两个库文件源码的情况下,通过函数库的使用就完成了对应功能的调用,即提供了功能又保护了源码。