动态库和静态库
静态库
静态库是在编译期间将库代码和应用程序代码合并到一个可执行文件中的库。因此,静态库的大小比较大,但是它的优点是在程序运行时不需要加载库文件,因此执行速度比较快。静态库的文件扩展名通常为.a 或 .lib。
动态库
动态库是在程序运行时才加载的库,因此它的文件大小比较小。动态库的优点是多个程序可以共享同一个动态库,从而节省系统资源。但是,与静态库相比,它的执行速度较慢。动态库的文件扩展名通常为.so 或 .dll。
](https://typora-1307795383.cos.ap-chengdu.myqcloud.com/typora/动态库 (共享库).svg)
静态库和动态库的区别
静态库和动态库都是用于存储编译后的二进制代码和函数库的文件。静态库和动态库的主要区别在于它们在程序编译期和运行期的使用不同。
总的来说,静态库适合于小型应用程序和独立运行的程序,而动态库适合于大型应用程序和需要共享库的程序。
三种文件:
- 头文件 .h
- 功能文件 .c
- 主文件 .c
位置:
- 头文件一般放在include文件夹里面
- 打包成库的一般就是功能文件,放在lib目录下
如何创建静态库 .a
//先把功能文件.c 用gcc -c转换成.o 文件
//使用ar命令,将.o文件转换成.a文件
ar crs libmyhello.a hello.o
//命名规范:已lib开头,已.a为后缀
//使用静态链接库
gcc -o hello main.c -L./lib -i./include -lmyhello
如何创建动态库 .so
//先把功能文件.c 用gcc -c转换成.o 文件 -fPIC表示与位置无关的目标文件
gcc -fPIC -Wall -c ?.c ?.c
//创建动态库
gcc -shared -o libmyhello.so ?.o ?.o
//使用动态链接库
gcc main.c -L./lib -lmyhello -I./include -o app
//运行发现报错,因为无法找到动态库。注意:动态库需要添加环境变量或者必须在/usr/lib/目录下,有一下解决方法
1.临时设置:export PATH=库路径,将当前目录加入环境变量,但是终端退出了就无效了。
2.永久设置:将上条写入家目录下.bashrc文件中
3.粗暴设置:直接将libmytest.so文件拷贝到/usr/lib/【/lib】目录下。(受libc库的启发)