h頭文件 .lib庫文件 .dll動態(tài)鏈接庫文件關(guān)系_第1頁
h頭文件 .lib庫文件 .dll動態(tài)鏈接庫文件關(guān)系_第2頁
h頭文件 .lib庫文件 .dll動態(tài)鏈接庫文件關(guān)系_第3頁
h頭文件 .lib庫文件 .dll動態(tài)鏈接庫文件關(guān)系_第4頁
h頭文件 .lib庫文件 .dll動態(tài)鏈接庫文件關(guān)系_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、h頭文件 .lib庫文件 .dll動態(tài)鏈接庫文件關(guān)系 .h頭文件是編譯時必須的,lib是鏈接時需要的,dll是運行時需要的。附加依賴項的是.lib不是.dll,若生成了DLL,則肯定也生成 LIB文件。如果要完成源代碼的編譯和鏈接,有頭文件和lib就夠了。如果也使動態(tài)連接的程序運行起來,有dll就夠了。在開發(fā)和調(diào)試階段,當然最好都有。.h .lib .dll三者的關(guān)系是:H文件作用是:聲明函數(shù)接口DLL文件作用是: 函數(shù)可執(zhí)行代碼當我們在自己的程序中引用了一個H文件里的函數(shù),編鏈器怎么知道該調(diào)用哪個DLL文件呢?這就是LIB文件的作用: 告訴鏈接器 調(diào)用的函數(shù)在哪個DLL中,函數(shù)執(zhí)行代碼在DL

2、L中的什么位置,這也就是為什么需要附加依賴項 .LIB文件,它起到橋梁的作用。如果生成靜態(tài)庫文件,則沒有DLL ,只有l(wèi)ib,這時函數(shù)可執(zhí)行代碼部分也在lib文件中目前以lib后綴的庫有兩種,一種為靜態(tài)鏈接庫(Static Libary,以下簡稱“靜態(tài)庫”),另一種為動態(tài)連接庫(DLL,以下簡稱“動態(tài)庫”)的導(dǎo)入庫(Import Libary,以下簡稱“導(dǎo)入庫”)。靜態(tài)庫是一個或者多個obj文件的打包,所以有人干脆把從obj文件生成lib的過程稱為Archive,即合并到一起。比如你鏈接一個靜態(tài)庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態(tài)lib只是殼子。動態(tài)庫一般會有對應(yīng)的導(dǎo)入庫,

3、方便程序靜態(tài)載入動態(tài)鏈接庫,否則你可能就需要自己LoadLibary調(diào)入DLL文件,然后再手工GetProcAddress獲得對應(yīng)函數(shù)了。有了導(dǎo)入庫,你只需要鏈接導(dǎo)入庫后按照頭文件函數(shù)接口的聲明調(diào)用函數(shù)就可以了。導(dǎo)入庫和靜態(tài)庫的區(qū)別很大,他們實質(zhì)是不一樣的東西。靜態(tài)庫本身就包含了實際執(zhí)行代碼、符號表等等,而對于導(dǎo)入庫而言,其實際的執(zhí)行代碼位于動態(tài)庫中,導(dǎo)入庫只包含了地址符號表等,確保程序找到對應(yīng)函數(shù)的一些基本地址信息。一般的動態(tài)庫程序有l(wèi)ib文件和dll文件。lib文件是必須在編譯期就連接到應(yīng)用程序中的,而dll文件是運行期才會被調(diào)用的。如果有dll文件,那么對應(yīng)的lib文件一般是一些索引信息

4、,具體的實現(xiàn)在dll文件中。如果只有l(wèi)ib文件,那么這個lib文件是靜態(tài)編譯出來的,索引和實現(xiàn)都在其中。靜態(tài)編譯的lib文件有好處:給用戶安裝時就不需要再掛動態(tài)庫了。但也有缺點,就是導(dǎo)致應(yīng)用程序比較大,而且失去了動態(tài)庫的靈活性,在版本升級時,同時要發(fā)布新的應(yīng)用程序才行。在動態(tài)庫的情況下,有兩個文件,而一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導(dǎo)出的函數(shù)的名稱和位置,DLL包含實際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數(shù)和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中,因此在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是DLL中所要調(diào)用的函數(shù)

5、的內(nèi)存地址,這樣當一個或多個應(yīng)用程序運行是再把程序代碼和被調(diào)用的函數(shù)代碼鏈接起來,從而節(jié)省了內(nèi)存資源。從上面的說明可以看出,DLL和.LIB文件必須隨應(yīng)用程序一起發(fā)行,否則應(yīng)用程序?qū)a(chǎn)生錯誤。-靜態(tài)鏈接庫(Lib)與動態(tài)鏈接庫(DLL)的區(qū)別(2009-03-06 12:53:39) 轉(zhuǎn)載標簽: 靜態(tài)鏈接庫lib動態(tài)鏈接庫dll區(qū)別it分類:編程技術(shù)靜態(tài)連接庫就是把(lib)文件中用到的函數(shù)代碼直接鏈接進目標程序,程序運行的時候不再需要其它的庫文件;動態(tài)鏈接就是把調(diào)用的函數(shù)所在文件模塊(DLL)和調(diào)用函數(shù)在文件中的位置等信息鏈接進目標程序,程序運行的時候再從DLL中尋找相應(yīng)函數(shù)代碼,因此需要

6、相應(yīng)DLL文件的支持。 靜態(tài)鏈接庫與動態(tài)鏈接庫都是共享代碼的方式,如果采用靜態(tài)鏈接庫,則無論你愿不愿意,lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執(zhí)行時可以“動態(tài)”地引用和卸載這個與 EXE 獨立的 DLL 文件。靜態(tài)鏈接庫和動態(tài)鏈接庫的另外一個區(qū)別在于靜態(tài)鏈接庫中不能再包含其他的動態(tài)鏈接庫或者靜態(tài)庫,而在動態(tài)鏈接庫中還可以再包含其他的動態(tài)或靜態(tài)鏈接庫?!懊恳粋€lib文件就是若干函數(shù)(假設(shè)只有函數(shù))的定義” lib庫有兩種,一種是包含了函數(shù)所在DLL文件和文件中函數(shù)位置的信息,稱為導(dǎo)出庫;一種是

7、包含函數(shù)代碼本身,一般現(xiàn)有的DLL,用的是前一種庫;以前在DOS下的TC/BC等,是后一種庫。包含函數(shù)原型聲明的,是頭文件(.h)。 “通過#include包含這些函數(shù)聲明的頭文件后,我們的應(yīng)用程序就可以使用lib文件中的函數(shù)” 還要指定編譯器鏈接相應(yīng)的庫文件。在IDE環(huán)境下,一般是一次指定所有用到的庫文件,編譯器自己尋找每個模塊需要的庫;在命令行編譯環(huán)境下,需要指定每個模塊調(diào)用的庫。 “那他和直接給出那個函數(shù)定義的文件,比如.cpp文件,和頭文件有什么區(qū)別,靜態(tài)鏈接庫有什么用” cpp文件是源代碼,庫文件是編譯后的二進制代碼,比如你可以調(diào)用Windows的API,但是不能看到其源代碼一樣。

8、“還有不明白的是,靜態(tài)鏈接庫中的lib文件只要用到,則整個lib文件的內(nèi)容都放進了exe文件中,那它是被編譯進去還是鏈接的時候連接進去的呢?” 是在鏈接的時候?qū)ib鏈接到目標代碼中。靜態(tài)鏈接庫(Lib)在VC+6.0中new一個名稱為libTest的static library工程,并新建lib.h和lib.cpp兩個文件,lib.h和lib.cpp的源代碼如下:/文件:lib.h#ifndef LIB_H#define LIB_Hextern "C" int add(int x,int y);/聲明為C編譯、連接方式的外部函數(shù)#endif/文件:lib.cpp#incl

9、ude "lib.h"int add(int x,int y)return x + y;編譯這個工程就得到了一個.lib文件,這個文件就是一個函數(shù)庫,它提供了add的功能。將頭文件和.lib文件提交給用戶后,用戶就可以直接使用其中的add函數(shù)了。標準Turbo C2.0中的C庫函數(shù)(我們用來的scanf、printf、memcpy、strcpy等)就來自這種靜態(tài)庫。下面來看看怎么使用這個庫,在libTest工程所在的工作區(qū)內(nèi)new一個libCall工程。libCall工程僅包含一個main.cpp文件,它演示了靜態(tài)鏈接庫的調(diào)用方法,其源代碼如下:#include <s

10、tdio.h>#include ".lib.h"/不可丟失#pragma comment( lib, ".debuglibTest.lib" ) /指定與靜態(tài)庫一起連接int main(int argc, char* argv)printf( "2 + 3 = %d", add( 2, 3 ) );靜態(tài)鏈接庫的調(diào)用就是這么簡單,或許我們每天都在用,可是我們沒有明白這個概念。代碼中#pragma comment( lib , ".debuglibTest.lib" )的意思是指本文件生成的.obj文件應(yīng)與lib

11、Test.lib一起連接-用VC+生成靜態(tài)庫文件今天閑著沒事做,自己寫了一點小筆記,不知道對于新手有沒用,高手就不用看了,作為新手的我斗膽來發(fā)表一個筆記,就是靜態(tài)庫文件的封裝過程,使用VC+6.0編寫,下面是正文,也許我的用語并不專業(yè)以前我們寫C/C+源文件的時候,都是先將各個寫好的源文件編譯,編譯生成的是目標文件機器碼,即.obj文件.(目標文件的擴展名不一定是.obj文件).我們調(diào)用的標準C/C+函數(shù)機器碼實際被封裝于標準C/C+靜態(tài)庫文件中的.即那些擴展名為.lib的文件中.最后鏈接器將我們編譯的各個目標文件里的機器碼和靜態(tài)庫(標準C/C+庫)中的函數(shù)機器碼鏈接到一起形成一個擴展名為.e

12、xe的可執(zhí)行文件模塊.在這里我們敘述將C/C+源文件編譯鏈接成一個靜態(tài)庫文件,但它不是可執(zhí)行模塊,它體內(nèi)含有可執(zhí)行機器碼靜態(tài)庫文件就像一個倉庫或者容器,里面封裝了一些可執(zhí)行機器碼.這些機器碼是我們用程序設(shè)計語言,比如C/C+源文件編譯后生成的機器碼.一.下面將討論將C/C+源文件編譯并鏈接成一個靜態(tài)庫文件的過程,在VC+6.0中選擇File-New-Win32 Static Library,寫好工程名創(chuàng)建好工作空間后再選擇菜單中New-File來為工程添加C或者C+ 源文件.假如我們?yōu)樵摴こ烫砑恿艘粋€名為lib_c.c和一個名為lib_cpp.cpp的源文件/lib_c.c中的內(nèi)容extern

13、 int Add(int x,int y) /該函數(shù)是一個外部函數(shù),任何文件都可以訪問它return x+y;extern int data_c/這是一個外部全局變量,任何文件可以訪問它/lib_cpp.cpp中的內(nèi)容extern “C” intreduce(int x,int y)/這里加了個”C”表示允許C源文件訪問這個C+函數(shù)代碼return x-y;extern “C” int data_cpp=2;注意以下幾點(1)當“extern”關(guān)鍵字修飾在函數(shù)或全局變量的定義中時,表示該函數(shù)或全局變量任何文件可以訪問,“extern”關(guān)鍵字可以省略不寫,缺省下就是”extern” &

14、#160;當“extern”關(guān)鍵字修飾在函數(shù)聲明或全局變量聲明中時,表示限定當前文件只能引用用“extern”關(guān)鍵字修飾定義的函數(shù)或全局變量.(2)當”static”關(guān)鍵字修飾在函數(shù)或全局變量的定義中時,表示該函數(shù)或全局變量只能由本文件中加了”static”關(guān)鍵字修飾的函數(shù)聲明或全局變量聲明來引用.  當”static”關(guān)鍵字修飾在函數(shù)聲明或全局變量聲明中時,表示限定當前文件只能引用用“static”關(guān)鍵字修飾定義的函數(shù)或全局變量.(3)在CPP源文件的函數(shù)和全局變量定義中加了個”C”表示允許C源文件訪問該函數(shù)和全局變量.如果是C+源文件訪它們的話則可加可不加.注意這”C”

15、要大寫.接下來就要將寫好的C/C+源文件進行編譯和鏈接,最后會生成一個擴展名為.lib的文件.該文件就是靜態(tài)庫文件了,該靜態(tài)庫文件是不能直接運行的,我們所編譯的C/C+源文件的機器碼就已經(jīng)被封裝進這個用VC+6.0創(chuàng)建的靜態(tài)庫文件里面去了.二.如何將編寫好的靜態(tài)庫文件像使用C/C+標準庫那樣使用,下面將繼續(xù)討論1.用VC+6.0新建一個工程名為TEST,添加一個名為TEST.c的源文件到該工程,因為我們將測試一下,將我們編寫的庫文件里的函數(shù)或者全局變量的機器碼鏈接到我們這個TEST.c源文件中去,假設(shè)我們生成的庫文件名為TEST.lib,先拷貝如下范例代碼到TEST.c中/TEST.c#inc

16、lude <stdio.h>extern int Add(int x,int y); /當前文件只能訪問“extern”關(guān)鍵字修飾定義的Add函數(shù)extern intreduce(int x,int y);/ /當前文件只能訪問“extern”關(guān)鍵字修飾定義的reduce函數(shù)#pragma comment(lib,"TEST.lib") /指示鏈接器到字符串所表示的文件路徑中去找?guī)煳募nt main()printf("%dn",Add(2,3);printf("%dn",reduce(3,2);return 0;這里我們

17、要聲明靜態(tài)庫中已知的函數(shù)或全局變量的聲明#pragma comment(lib,"TEST.lib")這條指令告訴鏈接器到字符串所表示的路徑下去找?guī)煳募?,這里我將庫文件放到了當前工程目錄下.也可以不寫這句.還有一種方法,可以直接在VC+6.0中設(shè)置依次選擇tools、options、directories、library files菜單或選項,填入庫文件路徑(只鍵入庫文件所在目錄路徑而不能輸入庫文件名),這只是告訴鏈接器庫文件所在目錄的路徑,還沒告訴鏈接器庫文件名,方法是VC+6.0中設(shè)置依次選擇project-settings-link 在object/library modules: 這欄輸入庫文件名字然后就OK了2.當用C+源文件的目標文件和庫文件的代碼鏈接時有一點小改變,這里就不浪費口舌了,假設(shè)我們新建了一個工程并添加了一個名為TEST.CPP的源文件,拷貝如下范例代碼到TEST.CPP中/TEST.cpp#include <stdio.h>extern “C” int Add(int x,int y); /表

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論