函數(shù)庫(kù)

一、什么是函數(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ù)的地址。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容