一、动态库
程序在运行时才去链接动态库的代码,多个程序共享库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
动态库的名字:lib开头+库名+.so , eg:libfile.so就是一个叫file的动态库
生成Ubuntu使用的动态库:gcc -shared -fPIC -o libfile.so file.c
生成开发板使用的动态库:arm-linux-gcc -shared -fPIC -o libfile.so file.c
二、静态库
静态库可以简单的看成一组目标文件的集合,即很多目标文件经过压缩打包后形成的文件。比如在我们日常编程中,如果需要使用printf函数,就需要包stdio.h的库文件,使用strlen时,又需要包string.h的库文件,可是如果直接把对应函数源码编译后形成的.o文件直接提供给我们,将会对我们的管理和使用上造成极大不便,于是可以使用“ar”压缩程序将这些目标文件压缩在一起,形成libx.a静态库文件。
静态库的名字:lib开头+库名+.a ,eg:libfile.a就是一个叫file的静态库
生成Ubuntu使用的静态库:
1、先生成.o文件---> gcc -c file.c
2、生成静态库 ---> ar crs libfile.a file.o
生成开发板使用的静态库:
1、先生成.o文件---> arm-linux-gcc -c file.c
2、生成静态库 ---> ar crs libfile.a file.o
三、使用链接库
参数: -L --->告诉编译器库(.so)的位置
-l --->告诉编译器库的名字(去掉lib,去掉后缀)
gcc myPro.c -o myPro -lfile -L. //libfile.a只需用file即可: -lfile
./myPro //执行程序
四、动态库和静态库的区别
1、生成可执行文件大小:静态库生成的可执行文件比动态库大,原因是编译时使用静态库会将调用的函数源码拷贝到可执行文件,动态库不会。
2、运行可执行程序时:动态库需要链接库,静态库不需要。
参考博客:
[1]https://blog.csdn.net/u012414189/article/details/84111636
[2]https://blog.csdn.net/u010665638/article/details/84562414
[3]https://blog.csdn.net/qq250941970/article/details/6199558
[4]https://blog.csdn.net/m0_37542524/article/details/83754738