面试被问到但是一窍不通,特来学习一下
静态库
概念
在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
LINUX下的静态库
Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为.a。
静态库的打包流程
1.先将需要生成库文件的所有文件编译成.o文件:
gcc -c a.c b.c c.c (不包含主函数的文件)
2.创建静态库(使用ar命令)
ar crv libmytest.a a.o b.o c.o
3.静态库的使用
gcc -o main main.c -L. -lxxx
WINDOWS使用静态库流程(vs 2019)
https://blog.csdn.net/m0_62833450/article/details/124738175
动态库
动态库的打包流程
1.先将需要生成库文件的所有文件编译成.o文件:
gcc -c a.c b.c c.c (不包含主函数的文件)
2.创建动态库
gcc -shared -o libmymath.so a.o b.o
3.动态库的使用
gcc -o main main.c -L. -lxxx
这时候我们发现运行./main时,会报错
能够成功编译,但是运行却报错了,为什么呢?
我们通过ldd命令列出动态库依赖关系,发现是not found。虽然已经告诉了编译器库文件和头文件的路径所在位置,但是当编译器编译好后,就与编译器无关了;当我们执行(运行)可执行程序a.out时,是由加载器来完成的。所以我们需要在运行时,告诉系统库文件在哪里;
解决方法:
1.打包到user/lib目录下
2.更改 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/home/mlg/lesson5-动静态库/friend/lib
LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径.注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找;
WINDOWS使用动态库流程(vs 2019)
https://blog.csdn.net/modi000/article/details/121786676?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168576335816800188586940%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168576335816800188586940&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~hot_rank-2-121786676-null-null.142v88insert_down28v1,239v2insert_chatgpt&utm_term=vs2019%E7%BC%96%E8%AF%91%E5%88%B6%E4%BD%9Cdll%E5%8A%A8%E6%80%81%E5%BA%93&spm=1018.2226.3001.4187