一、什么是函数库?
- 函数库:事先写好的函数的集合。给别人来复用。
- 函数是模块化的,因此可以被复用。写好的一个函数可以被反复使用。
二、函数库的由来
- 最开始没有函数库,每个人都要从0开始写程序。时间长了程序员就积累下来的有用的函数。
- 早期程序员经常参加行业聚会,聚会上互相交换各自的函数库。
- 后来,提出把各自的函数库收拢在一起,经过一些校准和整理,最后形成一份标准化的函数库,就是现在标准的函数库比如glibc。
三、函数库的提供形式:动态连接库与静态连接库
- 早期的函数共享是以源代码的形式进行的。这种方式共享是最彻底的(这种源码共享方式就形成了我们现在的开源社区)。这种方式的缺点就是无法以商业化的形式发布函数库。
- 商业公司需要将函数库共享给别人,但是不能给客户源代码,这时候就需要以库的形式(静态库和动态库)来提供。
- 最早出现的是静态连接库:静态库其实就是公司将自己的函数库源代码经过只编译不链接形成.o的目标文件,然后用ar工具将.o文件归档为.a的归档文件(.a的归档文件又叫静态链接库文件)。
- 公司通过发布.a库文件和.h的头文件来提供静态库给客户使用。客户拿到.a,.h文件后,通过.h头文件得知库中库函数的原型,然后在自己的.c文件中直接调用这些库文件,在链接的时候,连接器会在.a文件中拿出被调用发那个函数编译后的.o二进制代码段进去,形成最终的可执行程序。
- 动态链接库比静态链接库效率更高,现在一般都是用的是动态库。静态库在用户链接可执行程序时就把函数库的代码段链接到可执行程序中了,坏处是太占地方了。
- 有多个应用程序都使用这个库函数时,用动态链接库不会重复加载。
#include <stdio.h>
int main(void)
{
printf("hello world.\n");
}
四、函数库中库函数的使用
- gcc中编译程序默认是使用动态库的, 要想静态链接需要-static来强制静态链接。
- 库函数使用:一、要包含相应头文件;二、要注意函数原型;三、有些函数库链接时需要额外用-lxxx指定链接;四、动态库要用-l指定动态库的地址。