静态库和动态库
库:存放的是预先编译好的(.o文件)方法的集合;
Linux下,库分为静态库和共享库。
静态库:
生成静态库:
静态库:库名:Libxxx.a,lib是库的前缀,xxx是库名,.a为静态库的后缀。
第一步:将需要生成静态库的.c文件转换为编译后的.o文件
命令:gcc -S mian.o mian.c
第二步:将编译完成的.o文件放到一个集合中,生成静态库
命令:ar cr(v,可以没有) libxxx.a x.o xx.o xxx.o //c:create创建的意思 r:把方法添加到库里面 v:显示信息
使用静态库:
动态库的连接:
我们在创建一个新的子目录test,在函数中声明add和max;
共享库:
生成动态库:
共享库:库名:Libxxx.so,lib是库的前缀,xxx是库名,.so为共享库的后缀。
命令:gcc -shared -fPIC -o libxxx.so xx.c
-shared做共享库的命令,-fPIC是代码位置无关命令。
动态库的使用:
注意:如果共享库和静态库重名,且在一个目录下,系统默认使用共享库
在这里,我们执行main
我们发现./main执行是错误的;这里就要提一句:我们在执行文件main时,我们就要寻找共享库,共享库如果在标准目录(usr/lib)底下,我们就找的到,不在标准目录底下,程序就找不到
我们用ldd查看当前文件的信息,发现共享库libfoo.so找不到,所以我们需要将共享库拷贝到user/lib
注意:共享库要将其放在标准目录下才能找到
库一般放在/lib /usr/lib下,头文件在/usr/include下
默认只连接标准C库
可执行 /bin /usr/bin
显示可执行程序用到哪些库 命令 ldd 可执行文件
ldd:查看可执行程序用到哪些共享库
共享库和静态库的区别:
静态库:
-
静态函数库的扩展名一般为(.a或.lib),这类的函数库通常扩展名为libxxx.a或xxx.lib
-
这类库在编译的时候会直接整合到目标程序中,所以利用静态函数库编译成的文件体积会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,代码装载效率高,移植比较方便,而不再需要向外部要求读取函数库的内容;
-
从升级难易度来看明显没有优势,如果函数库更新,需要重新编译。(可维护性差)
共享库:
-
动态函数库的扩展名一般为(.so或.dll),这类函数库通常名为libxxx.so或xxx.dll
-
与静态函数库被整个捕捉到程序中不同,动态函数库在程序运行的时候进行链接,在程序里只有一个“指向”的位置而已,也就是说当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用;也就是说可执行文件无法单独运行。这样从产品功能升级角度方便升级,只要替换对应动态库即可,不必重新编译整个可执行文件。
-
使用动态库会更加节省内存并减少页面交换;可以实现进程之间的资源共享。(所以又被称为共享库)
注意:静态库只在链接时找一次。动态库找两次,链接时一次,运行时一次。
动态库删除后,生成的可执行文件对应的也不能执行;