静态库
命名规则:
linux:libxxx.a, 以lib为前缀,.a为后缀, xxx为静态库名字
windows: libxxx.lib, 以lib为前缀,.lib为后缀, xxx为静态库名字
制作
1,使用命令 gcc xxx.c xxx.c -c 制作 .o文件(二进制代码文件)
再将 .o 文件打包,使用 ar 工具(archive), ar rcs libxxx.a xxx.o xxx.o
2,将.o文件制作为可执行文件
编译程序时通过 “-l ” 参数指定静态库,“-L”参数指定搜索路径或者将目标静态库文件加入系统lib目录径中或者为其添加环境变量。总之,需要让系统知道静态库文件的位置
gcc -o main -lxxx -L/xxx
动态库
- 命名规则
Linux : libxxx.so, lib : 前缀, xxx : 库的名字,.so: 后缀
Windows : libxxx.dll,lib : 前缀, xxx : 库的名字,.dll: 后缀
制作
gcc -fpic -shared -o libxxx.so *.c
使用
编译程序时通过 “-l ” 参数指定动态库,“-L”参数指定搜索路径或者将目标动态库文件加入系统lib目录径中或者为其添加环境变量。总之,需要让系统知道动态库文件的位置
静态库和动态的区别
- 静态库 gcc 进行链接时,会把静态库中代码打包到可执行程序中,编译时加载;
- 动态库 gcc 进行链接时,动态库的代码不会被打包到可执行程序中,运行时加载;内存占用小,更新部署发布简单。
静态库,动态库优缺点
静态库的优点:
- 执行速度快, 是因为静态库已经编译到可执行文件内部了
- 发布程序时无需提供静态库,移植方便, 不依赖域其他的库文件
静态库的缺点:
- 耗费内存, 是由于每一个静态库的可执行程序都会加载一次
- 部署更新麻烦, 因为静态库修改以后所有的调用到这个静态库的可执行文件都需要重新编译
动态库:只在程序运行时载入内存,因此体积较小,共享库如果发生变化不需要重新编译;运行速度相对慢一些;
- 动态库把对一些库函数的链接载入推迟到程序运行的时期。
- 可以实现进程之间的资源共享。(因此动态库也称为共享库)
- 将一些程序升级变得简单。
- 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)
动态库的优点:
- 节省内存,
- 部署升级更新方便, 只需替换动态库即可, 然后再重启服务.
动态库的缺点:
- 运行速度比静态库慢
- 发布程序时需要提供动态库, 移植性差, 需要把所有用到的动态库都移植.