Linux下静态和动态库

库有什么用呢?

我们通常将一些公用函数写成函数库,所以库是别人写好的,现有的,成熟的,可以服用的代码,你可以使用但要必须得遵守许可协议。在我们现实开发过程中,不可能每一份代码都从头编写,当我们拥有库时,我们就可以直接将我们所需要的文件链接到我们的程序中。可以为我们节省大量的时间,提高开发效率。所以,哭的存在意义是不可藐视的。

Linux下的库

Linux下库分为两种,静态库和动态库。

区别

这两种库相同点是两种库都是由.o文件生成的,下边讨论一下它们的不同点:

静态库
静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。
链接时间: 静态库的代码是在编译过程中被载入程序中。
链接方式:静态库的链接是将整个函数库的所有数据都整合进了目标代码。这样做优点是在编译后的执行程序不在需要外部的函数库支持,因为所使用的函数都已经被编进去了。缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译。

动态库
动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libmytime.so
链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响你的程序,所以动态函数库升级比较方便。

它们两个还有很明显的不同点:当同一个程序分别使用静态库,动态库两种方式生成两个可执行文件时,静态链接所生成的文件所占用的内存要远远大于动态链接所生成的文件。(因为静态链接是在编译时将所有的函数都编译进了程序。而动态链接是在运行是才调用库里相应函数)

Linux下静态和动态库
Linux下静态和动态库
Linux下静态和动态库
Linux下静态和动态库
Linux下静态和动态库
!
Linux下静态和动态库
Linux下静态和动态库
切记文章中几点错误和注意点:
注意点:在生成库文件时命令:gcc time.c -c time.o,来生成二进制文件(预处理 编译 汇编过程,不包括链接过程),千万不要用gcc time.c -o time.o,具体原因:可执行文件根据c标准需要入口函数main等等原因,好好研究程序编译流程。
错误点: gcc -shared -fPIC -o libmytime.so time.o,其中-f后面跟一些编译选项,PIC是其中一种,表示生成位置无关代码(Position Independent Code)