為什麼呼叫c庫中庫檔案要有標頭檔案,而呼叫自己寫的靜態庫和動態庫就不需要包含匯出檔案的標頭檔案

2022-03-11 03:50:39 字數 3968 閱讀 5186

1樓:匿名使用者

什麼時候需要標頭檔案,是這樣的:

編譯程式如果遇到一個函式呼叫,那麼它就要查這個函式是否給出了呼叫的格式,假設這個函式是在呼叫程式前面寫出的,那麼經過編譯程式的編譯,編譯程式已經知道了函式呼叫規則格式,就不需要再說明了,比如:由於fun函式體寫在main函式之前,無需說明即可呼叫

void fun(int a,int n)void main()

如果函式寫在呼叫程式之後,編譯程式在編譯這個呼叫語句時,沒有編譯過這個函式,那就需要在前面事先說明一下了:

void fun(int a,int n); //函式頭說明語句void main()

void fun(int a,int n)那麼由於標準c函式庫的頭寫到標頭檔案中,你要使用必須加上這些函式的呼叫格式說明,所以要加include語句,你的函式其實也是一樣的。

2樓:匿名使用者

我也遇到同樣的問題:呼叫c庫裡的檔案,需要包含其標頭檔案,呼叫自己定義的庫檔案,就不需要包含對應的標頭檔案,為什麼??

動態庫和靜態庫的區別

3樓:北極星點亮

兩者區別:

a,靜態庫的使用需要:

1 包含一個對應的標頭檔案告知編譯器lib檔案裡面的具體內容

2 設定lib檔案允許編譯器去查詢已經編譯好的二進位制**

b,動態庫的使用:

程式執行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫

c,依賴性:

靜態連結表示靜態性,在編譯連結之後, lib庫中需要的資源已經在可執行程式中了, 也就是靜態存在,沒有依賴性了

動態,就是實時性,在執行的時候載入需要的資源,那麼必須在執行的時候提供 需要的 動態庫,有依賴性, 執行時候沒有找到庫就不能執行了

d,區別:

簡單講,靜態庫就是直接將需要的**連線進可執行程式;動態庫就是在需要呼叫其中的函式時,根據函式對映表找到該函式然後調入堆疊執行。

做成靜態庫可執行檔案本身比較大,但不必附帶動態庫

做成動態庫可執行檔案本身比較小,但需要附帶動態庫

連結靜態庫,編譯的可執行檔案比較大,當然可以用strip命令精簡一下(如:strip libtest.a),但還是要比連結動態庫的可執行檔案大。程式執行時間速度稍微快一點。

靜態庫是程式執行的時候已經調入記憶體,不管有沒有呼叫,都會在記憶體裡頭。靜態庫在程式編譯時會被連線到目標**中,程式執行時將不再需要該靜態庫。

其在編譯程式時若連結,程式執行時會在系統指定的路徑下搜尋,然後匯入記憶體,程式一般執行時間稍微長一點,但編譯的可執行檔案比較小;動態庫是程式執行的時候需要呼叫的時候才裝入記憶體,不需要的時候是不會裝入記憶體的。

動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。

動態連結庫的特點與優勢

首先讓我們來看一下,把庫函式推遲到程式執行時期載入的好處:

1. 可以實現程序之間的資源共享。

什麼概念呢?就是說,某個程式的在執行中要呼叫某個動態連結庫函式的時候,作業系統首先會檢視所有正在執行的程式,看在記憶體裡是否已有此庫函式的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才連結載入。

這樣的模式雖然會帶來一些「動態連結」額外的開銷,卻大大的節省了系統的記憶體資源。c的標準庫就是動態連結庫,也就是說系統中所有執行的程式共享著同一個c標準庫的**段。

2. 將一些程式升級變得簡單。使用者只需要升級動態連結庫,而無需重新編譯連結其他原有的**就可以完成整個程式的升級。windows 就是一個很好的例子。

3. 甚至可以真正坐到連結載入完全由程式設計師在程式**中控制。

程式設計師在編寫程式的時候,可以明確的指明什麼時候或者什麼情況下,連結載入哪個動態連結庫函式。你可以有一個相當大的軟體,但每次執行的時候,由於不同的操作需求,只有一小部分程式被載入記憶體。所有的函式本著「有需求才調入」的原則,於是大大節省了系統資源。

比如現在的軟體通常都能開啟若干種不同型別的檔案,這些讀寫操作通常都用動態連結庫來實現。在一次執行當中,一般只有一種型別的檔案將會被開啟。所以直到程式知道檔案的型別以後再載入相應的讀寫函式,而不是一開始就將所有的讀寫函式都載入,然後才發覺在整個程式中根本沒有用到它們。

靜態庫:在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。

動態庫:在目標檔案執行時載入,手動載入,且對庫有依賴性。

具體在開發中用到哪種庫,我覺得還是根據實際的記憶體大小,rom大小,執行的速度等綜合考慮。

4樓:福喜

兩者區別:

一,靜態庫的使用需要:

1 包含一個對應的標頭檔案告知編譯器lib檔案裡面的具體內容

2 設定lib檔案允許編譯器去查詢已經編譯好的二進位制**

二,動態庫的使用:

程式執行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫

三,依賴性:

靜態連結表示靜態性,在編譯連結之後, lib庫中需要的資源已經在可執行程式中了, 也就是靜態存在,沒有依賴性了

動態,就是實時性,在執行的時候載入需要的資源,那麼必須在執行的時候提供 需要的 動態庫,有依賴性, 執行時候沒有找到庫就不能執行了

四,區別:

簡單講,靜態庫就是直接將需要的**連線進可執行程式;動態庫就是在需要呼叫其中的函式時,根據函式對映表找到該函式然後調入堆疊執行。

做成靜態庫可執行檔案本身比較大,但不必附帶動態庫

做成動態庫可執行檔案本身比較小,但需要附帶動態庫

五: 首先糾正所謂「靜態連線就是把需要的庫函式放進你的exe之中」的說法。在真實世界中,有三個概念:

use static libary, static linked dll, dynamic linked dll.

多數人混淆了static libary 和 static linked dll的概念,當然他們有似是而非的「相似之處」,比如都用到.lib,下面具體說明。

使用靜態庫(use static libary)是把.lib和其他.obj一起build在目標檔案中,目標檔案可以是.

exe,也可以是.dll或.oxc等。

一般情況下,可以根本就沒有「對應的」.dll 檔案,如c run time(crt)庫。一個例子就是,寫一個main(){},build出來並不是只有幾個位元組,當然有人會說那還有exe檔案頭呢?

是,即使加上檔案頭的尺寸,build出的執行檔案仍然「莫名的大」。實際上那多出來的部分就是crt靜態庫。姑且可以把靜態庫.

lib理解成外部程式的obj檔案比較合理,它包含了函式的實現。

5樓:阿爾邁凡

動態連結庫和靜態連結庫一般是編譯整合一系列的介面(函式)

在程式源**編譯完成後通過編譯器編譯並通過連結器與這些庫進行連結

動態連結庫與靜態連結庫的區別在於連結器在進行連結時靜態庫會被直接編譯程序序裡

而動態連結庫並不會,我們這裡將這些連結庫稱作依賴(動態庫和靜態庫)

程式的執行需要這些依賴,程式在靜態連結後該程式本身便已包含該依賴

而動態連結後的程式本身本不包含該依賴,這些依賴需要執行者自行安裝進作業系統(動態庫、執行時庫)

程式執行時會動態地載入這些庫

linux上動態庫一般的字尾後為.so

靜態庫一般的字尾為.a

由於靜態連結會直接將庫編譯程序序裡所以靜態編譯後的程式相較於動態連結所要大

這就是因為靜態連結會將連結庫編譯程序序裡的原因,所以佔用就要大了

出於這種原因,靜態庫不易於維護與更新,如果連結庫中有實現有bug等需要更新則需要更新整個程式,因為靜態庫被編譯程序序中了

但動態庫就沒有這種情況了,因為動態庫是程式執行時動態載入的,所以我們只需要更新動態庫而不需要更新所有依賴該庫的程式(軟體)

另一方面,很多程式的開發都會使用到相同的連結庫,也就是很多程式(軟體)會有相同的依賴

如果將這些依賴全部靜態編譯的話將會造成儲存資源佔用過多而造成資源浪費

而使用動態庫的方式這些程式(軟體)則可以共享一個連結庫,而不需要每個程式都帶一個連結庫,這樣就大大地減少了儲存資源佔用空間

C中如何定義資料庫操作類,並呼叫

以下是我編寫的一個操作access資料庫的類,其他資料庫可以參考修改,原理差不多的。希望對你有幫助。using system using system.collections.generic using system.text using system.data.oledb using system...

c如何引用類檔案如何向c類庫檔案中新增類檔案

定義名字空間namespace 把你的類寫在自己定義的namespace裡面,然後直接using namespace就可以使用你自己的類了 舉例 namespace myspace 使用時直接 using myspace 新增 引用 找到藥引用的類檔案,加入到你的專案解決方案中就可以了,要使用這個類...

什麼是類庫?在C中怎樣設計類庫,在C 中怎樣設計類庫?

類庫 class library 是一個綜合性的物件導向的可重用型別集合,這些型別包括 介面 抽象類和具體類。類庫可以解決一系列常見程式設計任務 包括諸如字串管理 資料收集 資料庫連線以及檔案訪問等任務 還可以解決多種專用開發任務 控制檯應用程式 桌面應用程式 web應用程式等 類庫字面意思就是類的...