这里写目录标题
- 初识静态库与动态库
- 静态函数库
- 动态函数库
初识静态库与动态库
静态函数库与动态函数库的使用中,有人也把他称为程序的静态链接及动态链接。
静态链接:指程序链接时使用静态库的链接方式,把所有需要的库函数加入(拷贝)到了可执行程序当中。
动态链接:指程序链接时使用动态库的链接方式,在编译链接时,只把所需库函数的指针保存在了可执行程序中,在运行时再通过指针找到所需库函数。
静态函数库:程序在链接时,已经把所有所有需的库函数加入(拷贝)到了可执行程序当中,由于加入了库函数所以生成的文件会比较大。但优点是运行时不再需要调用外部库函数了。
动态函数库库:与静态库相反,程序在链接时,只把所需库函数的指针保存在了可执行程序中,在运行时再通过指针找到所需库函数。优点是这样生成的文件比较小,但是使用动态库函数的可执行程序是不能独立运行的,需要依赖外部的动态库。
静态函数库
这类函数库在编译的时候会直接整合到执行程序当中,所以利用静态函数库编译成的文件会比较大一些。
如下图同一段代码使用动态函数库编译出来的可执行程序大小为 8384 ,而使用静态函数库编译的可执行程序 大小为 861240
在不知情的情况下如何查看文件采用何种函数库(链接方式)
命令:file 文件名
作用:查看文件链接方式
操作如下:
优点:虽然使用静态函数库的可执行程序文件大小比较大,但是这类可执行程序能独立运行,不需要依赖外部函数库。
缺点:虽然执行文件能独立运行,但因为函数库是直接整合到文件中的,所以要升级更改函数库时,整个执行文件必须要重新编译才能将新版的函数库整合到程序中,这就比较消耗时间。
动态函数库
程序如果使用动态函数库(动态链接),在程序中只保存了函数库中的函数指针而已。也就是说,动态函数库的内容并没有被整合到可执行文件中,而是当程序要使用函数库相关函数时,程序才会通过函数指针找到该函数并使用。 所以由于可执行程序只保存了函数库中函数的指针,并不包含内容,所以他所形成的文件会小很多。
优点 :虽然这类程序不能独立运行,然而其文件中的函数指针具有指向性,所以当函数库中的函数升级后,执行文件根本不需要重新编译,因为可执行文件会依然指向升级后的函数。(新旧版本的函数库文件名及函数名需相同)
缺点:程序不能独立运行,程序所依赖的函数库不能随意删除或移动,会影响依赖他的程序。
拓展:目前的Linux发行版比较倾向于使用动态函数库,因为如同上面提到的最重要的一一点,就是函数库的升级方便。由于Linux系统里面的软件依赖性太复杂了,如果使用太多的静态函数库,那么升级某一个函数库时,就会对整个系统造成很大的冲击。因为其他依赖的执行文件也要同时重新编译,这个时候动态函数库可就有用多了,因为只要动态函数库升级就好,其他的软件根本无须变动。