一、什么是函數(shù)庫(kù)?
- 函數(shù)庫(kù):事先寫好的函數(shù)的集合。給別人來(lái)復(fù)用。
- 函數(shù)是模塊化的,因此可以被復(fù)用。寫好的一個(gè)函數(shù)可以被反復(fù)使用。
二、函數(shù)庫(kù)的由來(lái)
- 最開始沒有函數(shù)庫(kù),每個(gè)人都要從0開始寫程序。時(shí)間長(zhǎng)了程序員就積累下來(lái)的有用的函數(shù)。
- 早期程序員經(jīng)常參加行業(yè)聚會(huì),聚會(huì)上互相交換各自的函數(shù)庫(kù)。
- 后來(lái),提出把各自的函數(shù)庫(kù)收攏在一起,經(jīng)過一些校準(zhǔn)和整理,最后形成一份標(biāo)準(zhǔn)化的函數(shù)庫(kù),就是現(xiàn)在標(biāo)準(zhǔn)的函數(shù)庫(kù)比如glibc。
三、函數(shù)庫(kù)的提供形式:動(dòng)態(tài)連接庫(kù)與靜態(tài)連接庫(kù)
- 早期的函數(shù)共享是以源代碼的形式進(jìn)行的。這種方式共享是最徹底的(這種源碼共享方式就形成了我們現(xiàn)在的開源社區(qū))。這種方式的缺點(diǎn)就是無(wú)法以商業(yè)化的形式發(fā)布函數(shù)庫(kù)。
- 商業(yè)公司需要將函數(shù)庫(kù)共享給別人,但是不能給客戶源代碼,這時(shí)候就需要以庫(kù)的形式(靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù))來(lái)提供。
- 最早出現(xiàn)的是靜態(tài)連接庫(kù):靜態(tài)庫(kù)其實(shí)就是公司將自己的函數(shù)庫(kù)源代碼經(jīng)過只編譯不鏈接形成.o的目標(biāo)文件,然后用ar工具將.o文件歸檔為.a的歸檔文件(.a的歸檔文件又叫靜態(tài)鏈接庫(kù)文件)。
- 公司通過發(fā)布.a庫(kù)文件和.h的頭文件來(lái)提供靜態(tài)庫(kù)給客戶使用。客戶拿到.a,.h文件后,通過.h頭文件得知庫(kù)中庫(kù)函數(shù)的原型,然后在自己的.c文件中直接調(diào)用這些庫(kù)文件,在鏈接的時(shí)候,連接器會(huì)在.a文件中拿出被調(diào)用發(fā)那個(gè)函數(shù)編譯后的.o二進(jìn)制代碼段進(jìn)去,形成最終的可執(zhí)行程序。
- 動(dòng)態(tài)鏈接庫(kù)比靜態(tài)鏈接庫(kù)效率更高,現(xiàn)在一般都是用的是動(dòng)態(tài)庫(kù)。靜態(tài)庫(kù)在用戶鏈接可執(zhí)行程序時(shí)就把函數(shù)庫(kù)的代碼段鏈接到可執(zhí)行程序中了,壞處是太占地方了。
- 有多個(gè)應(yīng)用程序都使用這個(gè)庫(kù)函數(shù)時(shí),用動(dòng)態(tài)鏈接庫(kù)不會(huì)重復(fù)加載。
#include <stdio.h>
int main(void)
{
printf("hello world.\n");
}
四、函數(shù)庫(kù)中庫(kù)函數(shù)的使用
- gcc中編譯程序默認(rèn)是使用動(dòng)態(tài)庫(kù)的, 要想靜態(tài)鏈接需要-static來(lái)強(qiáng)制靜態(tài)鏈接。
- 庫(kù)函數(shù)使用:一、要包含相應(yīng)頭文件;二、要注意函數(shù)原型;三、有些函數(shù)庫(kù)鏈接時(shí)需要額外用-lxxx指定鏈接;四、動(dòng)態(tài)庫(kù)要用-l指定動(dòng)態(tài)庫(kù)的地址。