h
標頭檔案.lib
庫檔案.dll
動態鏈結庫檔案關係
.h標頭檔案是編譯時必須的,
lib是鏈結時需要的,
dll是執行時需要的。
附加依賴項的是
.lib
不是.dll
,若生成了
dll,
則肯定也生成
lib檔案。如果要完成源**的編譯和鏈結,有標頭檔案和
lib就夠了。如果也使動態連線的程式執行起來,有
dll就夠了。在開發和除錯階段,當然最好都有。
.h .lib .dll
三者的關係是: h
檔案作用是
:宣告函式介面
dll檔案作用是
: 函式可執行**
當我們在自己的程式中引用了乙個
**件裡的函式
,編鏈器怎麼知道該呼叫哪個
dll檔案呢
?這就是
lib檔案的作用
: 告訴鏈結器 呼叫的函式在哪個
dll中,函式執行**在
dll中的什麼位置,這也就是為什麼需要附加依賴項
.lib
檔案,它起到橋梁的作用。如果生成靜態庫檔案,則沒有
dll ,只有
lib,這時函式可執行**部分也在
lib檔案中
目前以lib字尾的庫有兩種,一種為靜態鏈結庫
(static libary
,以下簡稱「靜態庫」
),另一種為動態連線庫
(dll
,以下簡稱「動態庫」
)的導入庫
(import libary
,以下簡稱「導入庫」)。靜態庫是乙個或者多個
obj檔案的打包,所以有人乾脆把從
obj檔案生成
lib的過程稱為
archive
,即合併到一起。比如你鏈結乙個靜態庫,如果其中有錯,它會準確的找到是哪個
obj有錯,即靜態
lib只是殼子。動態庫一般會有對應的導入庫,方便程式靜態載入動態鏈結庫,否則你可能就需要自己
loadlibary
調入dll
檔案,然後再手工
getprocaddress
獲得對應函式了。有了導入庫,你只需要鏈結導入庫後按照標頭檔案函式介面的宣告呼叫函式就可以了。導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行**、符號表等等,而對於導入庫而言,其實際的執行**位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。
一般的動態庫程式有
lib檔案和
dll檔案。
lib檔案是必須在編譯期就連線到應用程式中的,而
dll檔案是執行期才會被呼叫的。如果有
dll檔案,那麼對應的
lib檔案一般是一些索引資訊,具體的實現在
dll檔案中。如果只有
lib檔案,那麼這個
lib檔案是靜態編譯出來的,索引和實現都在其中。靜態編譯的
lib檔案有好處:給使用者安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程式比較大,而且失去了動態庫的靈活性,在版本公升級時,同時要發布新的應用程式才行。在動態庫的情況下,有兩個檔案,而乙個是引入庫(
.lib
)檔案,乙個是
dll檔案,引入庫檔案包含被
dll匯出的函式的名稱和位置,
dll包含實際的函式和資料,應用程式使用
lib檔案鏈結到所需要使用的
dll檔案,庫中的函式和資料並不複製到可執行檔案中,因此在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是
dll中所要呼叫的函式的記憶體位址,這樣當乙個或多個應用程式執行是再把程式**和被呼叫的函式**鏈結起來,從而節省了記憶體資源。從上面的說明可以看出,
dll和
.lib
檔案必須隨應用程式一起發行,否則應用程式將會產生錯誤。
標頭檔案與同名原始檔的關係
一 原始檔如何根據 include來關聯標頭檔案 1,系統自帶的標頭檔案用尖括號括起來,這樣編譯器會在系統檔案目錄下查詢。include 2,使用者自定義的檔案用雙引號括起來,編譯器首先會在使用者目錄下查詢,然後在到c 安裝目錄 比如vc中可以指定和修改庫檔案查詢路徑,unix和linux中可以通過...
C 庫檔案與標頭檔案的區別
標頭檔案中有函式的申明,庫檔案實現函式的定義。比如,printf函式。使用時應包括stdio.h,開啟stdio.h你只能看到,printf這 個函式的申明,卻看不到printf具體是怎麼實現的,而函式的實現在相應的c庫 中。而庫檔案一般是以二進位制形式而不是c原始檔形式提供給使用者使用的。程式 中...
C 標頭檔案和原始檔的關係
一 原始檔如何根據 include 來關聯標頭檔案 1,系統自帶的標頭檔案用尖括號括起來 include,這樣編譯器會在系統檔案目錄下查詢。2,使用者自定義的檔案用雙引號括起來 include h 編譯器首先會在使用者目錄下查詢,然後在到 c 安裝目錄 比如 vc中可以指定和修改庫檔案查詢路徑,un...