![](https://csdnimg.cn/release/download_crawler_static/88407794/bg1.jpg)
【C语⾔】静态链接库与动态链接库的制作与使⽤
⼀、函数库简述
简单来说,函数库就是⼀些事先写好的模块化的函数的集合,可以供给其他程序员使⽤。最开始没有函数库,每个程序员写程序都要从零开
始写,时间长了慢慢地就积累下来了⼀些优质的函数库。后来有组织把各种函数库收拢在⼀起,经过校准和整理,形成⼀份标准化的函数
库,就是现在的标准的函数库,如 glibc
早期的函数共享都是以源代码的形式进⾏的,慢慢地,源码共享的⽅向就形成了我们现在的开源社区,⽆法以商业化形式来发布函数库。商
业公司需要将⾃⼰的函数库让他⼈付费使⽤,但是⼜不能给客户源代码,这时候就出现了静态链接库和动态链接库。
商业公司将函数库源代码经过只编译不连接形成 .o 的⽬标⽂件,然后⽤ ar ⼯具将 .o ⽂件归档成 .a 的归档⽂件,这个 .a 的归档⽂件就
叫做静态链接库⽂件。通过发布 .a 库⽂件和 .h 头⽂件来提供静态库给客户使⽤;
客户拿到 .a 和 .h ⽂件后,通过 .h 头⽂件得知库中的库函数的原型,然后在⾃⼰的 .c ⽂件中直接调⽤这些库⽂件,在链接的时候链接器
会去 .a ⽂件中拿出被调⽤的那个函数的编译后的 .o ⼆进制代码段链接进去形成最终的可执⾏程序。
动态库⽐静态链接库出现得晚⼀些,效率更⾼⼀些。现在⼀般都是使⽤动态库。静态库在⽤户链接⾃⼰的可执⾏程序时就已经把调⽤的
库中的函数的代码段链接进最终可执⾏程序中了,这样好处是随处可以执⾏,坏处是太占地⽅了。尤其是有多个应⽤程序都使⽤了同⼀
个库函数时,最后⽣成的可执⾏程序中都各⾃有⼀份这个库函数的代码段。当这些应⽤程序同时在内存中运⾏时,实际上在内存中有多
个这个库函数的代码段,这完全重复了。
⽽动态链接库本⾝不将库函数的代码段链接⼊可执⾏程序,只是做个标记。然后当应⽤程序在内存中执⾏时,运⾏时环境发现它调⽤了
⼀个动态库中的库函数时,会去加载这个动态库到内存中,然后以后不管有多少个应⽤程序去调⽤这个库中的函数都会跳转到第⼀次加
载的地⽅去执⾏(不会重复加载)。
gcc 中编译链接程序默认使⽤动态库,要静态链接需要显式⽤ -static 来强制静态链接。库函数的使⽤需要注意:
1. 包含相应的头⽂件
2. 调⽤库函数时注意函数原型
3. 有些库函数链接时需要额外⽤ -lxxx 来指定链接
4. 如果不是系统库,要注意⽤ -L 指定库的地址
1. 真正的数学运算的函数定义在: /usr/include/x86_64-linux-gnu/bits/mathcalls.h
2. 使⽤数学库函数的时候,只需要包含 math.h 即可