一、什么是函數(shù)庫剖淀?
- 函數(shù)庫:事先寫好的函數(shù)的集合纯蛾。給別人來復(fù)用。
- 函數(shù)是模塊化的纵隔,因此可以被復(fù)用翻诉。寫好的一個(gè)函數(shù)可以被反復(fù)使用。
二捌刮、函數(shù)庫的由來
- 最開始沒有函數(shù)庫碰煌,每個(gè)人都要從0開始寫程序。時(shí)間長了程序員就積累下來的有用的函數(shù)绅作。
- 早期程序員經(jīng)常參加行業(yè)聚會(huì)芦圾,聚會(huì)上互相交換各自的函數(shù)庫。
- 后來俄认,提出把各自的函數(shù)庫收攏在一起个少,經(jīng)過一些校準(zhǔn)和整理,最后形成一份標(biāo)準(zhǔn)化的函數(shù)庫眯杏,就是現(xiàn)在標(biāo)準(zhǔn)的函數(shù)庫比如glibc夜焦。
三、函數(shù)庫的提供形式:動(dòng)態(tài)連接庫與靜態(tài)連接庫
- 早期的函數(shù)共享是以源代碼的形式進(jìn)行的岂贩。這種方式共享是最徹底的(這種源碼共享方式就形成了我們現(xiàn)在的開源社區(qū))茫经。這種方式的缺點(diǎn)就是無法以商業(yè)化的形式發(fā)布函數(shù)庫。
- 商業(yè)公司需要將函數(shù)庫共享給別人河闰,但是不能給客戶源代碼科平,這時(shí)候就需要以庫的形式(靜態(tài)庫和動(dòng)態(tài)庫)來提供。
- 最早出現(xiàn)的是靜態(tài)連接庫:靜態(tài)庫其實(shí)就是公司將自己的函數(shù)庫源代碼經(jīng)過只編譯不鏈接形成.o的目標(biāo)文件姜性,然后用ar工具將.o文件歸檔為.a的歸檔文件(.a的歸檔文件又叫靜態(tài)鏈接庫文件)瞪慧。
- 公司通過發(fā)布.a庫文件和.h的頭文件來提供靜態(tài)庫給客戶使用〔磕睿客戶拿到.a弃酌,.h文件后,通過.h頭文件得知庫中庫函數(shù)的原型儡炼,然后在自己的.c文件中直接調(diào)用這些庫文件妓湘,在鏈接的時(shí)候,連接器會(huì)在.a文件中拿出被調(diào)用發(fā)那個(gè)函數(shù)編譯后的.o二進(jìn)制代碼段進(jìn)去乌询,形成最終的可執(zhí)行程序榜贴。
- 動(dòng)態(tài)鏈接庫比靜態(tài)鏈接庫效率更高,現(xiàn)在一般都是用的是動(dòng)態(tài)庫妹田。靜態(tài)庫在用戶鏈接可執(zhí)行程序時(shí)就把函數(shù)庫的代碼段鏈接到可執(zhí)行程序中了唬党,壞處是太占地方了鹃共。
- 有多個(gè)應(yīng)用程序都使用這個(gè)庫函數(shù)時(shí),用動(dòng)態(tài)鏈接庫不會(huì)重復(fù)加載驶拱。
#include <stdio.h>
int main(void)
{
printf("hello world.\n");
}
四霜浴、函數(shù)庫中庫函數(shù)的使用
- gcc中編譯程序默認(rèn)是使用動(dòng)態(tài)庫的, 要想靜態(tài)鏈接需要-static來強(qiáng)制靜態(tài)鏈接蓝纲。
- 庫函數(shù)使用:一阴孟、要包含相應(yīng)頭文件;二税迷、要注意函數(shù)原型永丝;三、有些函數(shù)庫鏈接時(shí)需要額外用-lxxx指定鏈接翁狐;四类溢、動(dòng)態(tài)庫要用-l指定動(dòng)態(tài)庫的地址凌蔬。