动静态库的学习
动静态库中,不需要包含main函数
文件分为内存级(被打开的)文件和磁盘级文件
库
每个程序都要依赖很多基础的底层库,本质上来说库是一种可执行代码的二进制形式,可以被载入内存执行
静态库 linux .a windows .lib
动态库 linux .so windows .dll
静态库
静态库在链接时直接是把库的实现拷贝到可执行文件里,一旦形成可执行程序,可执行程序不在再依赖静态库
静态库的生成
libxxx.a
静态库的使用
-L:指定库路径
-I:指定头文件搜索路径
-l:指定库名
库文件名称:去掉 lib 前缀和 .a 后缀
检测一个可执行文件依赖的库
静态库在链接时直接是把库的实现拷贝到可执行文件里,一旦形成可执行程序,可执行程序不在再依赖静态库。动态库需要在加载程序的同时找到所依赖的库
动态库
动态库的生成
fPIC:产生位置无关码
libxxx.so
动态库形成可执行文件和静态库一样
但是可执行文件不能执行
系统并不等于gcc
解决方法
•拷贝.so文件到系统共享库路径下
系统会在lib64/ 或者/usr/local/ 路径下寻找动态库
•向系统共享库路径下建立同名软连接
•更改环境变量
OS运行程序,要查找动态库,也会在该环境变量下查找动态库(LD_LIBRARY_PATH)
•把我们要找的动态库文件的路径复制下来,拷贝至配置文件
结论
1. 动静态库同时存在gcc/g++默认使用动态库
非要使用静态库,只能带 -static,一旦-static,就必须存在对应的静态库
只存在静态库,可执行文件,对于该库,只能静态链接了
2. 在linux系统下,默认情况安装的大部分库,默认都优先安装的是动态库
3. 库:应用程序 = 1:n
4. vs不仅仅形成可执行程序,也能形成动静态库
这些二进制文件都是FLF格式的