動態鏈結庫dll,靜態鏈結庫lib, 導入庫lib

2021-08-30 10:04:00 字數 2305 閱讀 4164

目前以lib字尾的庫有兩種,一種為靜態鏈結庫(static libary,以下簡稱"靜態庫"),另一種為動態連線庫(dll,以下簡稱"動態庫")的導入庫(import libary,以下簡稱"導入庫")。

靜態庫是乙個或者多個obj檔案的打包,所以有人乾脆把從obj檔案生成lib的過程稱為archive,即合併到一起。比如你鏈結乙個靜態庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態lib只是殼子。

動態庫一般會有對應的導入庫,方便程式靜態載入動態鏈結庫,否則你可能就需要自己loadlibary調入dll檔案,然後再手工getprocaddress獲得對應函式了。有了導入庫,你只需要鏈結導入庫後按照標頭檔案函式介面的宣告呼叫函式就可以了。

導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行**、符號表等等,而對於導入庫而言,其實際的執行**位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。

這也是實際上很多開源**發布的慣用方式:

1. 預編譯的開發包:包含一些.dll檔案和一些.lib檔案。其中這裡的.lib就是導入庫,而不要錯以為是靜態庫。但是引入方式和靜態庫一樣,要在鏈結路徑上新增找到這些.lib的路徑。而.dll則最好放到最後產生的應用程式exe執行檔案相同的目錄。這樣執行時,就會自動調入動態鏈結庫。

3. 如果你只有dll,並且你知道dll中函式的函式原型,那麼你可以直接在自己程式中使用loadlibary調入dll檔案,getprocaddress

dll:

動態鏈結庫 (dll) 是作為共享函式庫的可執行檔案。動態鏈結提供了一種方法,使程序可以呼叫不屬於其可執行**的函式。函式的可執行**位於乙個 dll 中,該 dll 包含乙個或多個已被編譯、鏈結並與使用它們的程序分開儲存的函式。dll 還有助於共享資料和資源。多個應用程式可同時訪問記憶體中單個 dll 副本的內容。

動態鏈結與靜態鏈結的不同之處在於它允許可執行模組(.dll 檔案或 .exe 檔案)僅包含在執行時定位 dll 函式的可執行**所需的資訊。在靜態鏈結中,鏈結器從靜態鏈結庫獲取所有被引用的函式,並將庫同**一起放到可執行檔案中。

使用動態鏈結代替靜態鏈結有若干優點。dll 節省記憶體,減少交換操作,節省磁碟空間,更易於公升級,提供售後支援,提供擴充套件 mfc 庫類的機制,支援多語言程式,並使國際版本的建立輕鬆完成。

api 就是應用程式程式設計介面。它是能用來操作元件、應用程式或者作業系統的一組函式。典型的情況下,api 由乙個或多個提供某種特殊功能的 dll 組成。

dll 是乙個檔案,其中包含了在 microsoft? windows? 下執行的任何應用程式都可呼叫的函式。執行時,dll 中的函式動態地鏈結到呼叫它的應用程式中。無論有多少應用程式呼叫 dll 中的某個函式,在磁碟上只有乙個檔案包含該函式,且只在它調入記憶體時才建立該 dll。

您聽到最多的 api 可能是 windows api,它包括構成 windows 作業系統的各種 dll。每個 windows 應用程式都直接或間接地與 windows api 互動。windows api 保證 windows 下執行的所有應用程式的行為方式一致。

注意 隨著 windows 作業系統的發展,現已發布了幾個版本的 windows api。windows 3.1 使用 win16 api。microsoft? windows nt?、windows 95 和 windows 98 平台使用 microsoft? win32? api。

除 windows api 外,其他一些 api 也已發布。例如,郵件應用程式程式設計介面 (mapi) 是一組可用於編寫電子郵件應用程式的 dll。

api 傳統上是為開發 windows 應用程式的 c 和 c++ 程式設計師編寫的,但其他的程式語言(包括vba)也可以呼叫 dll 中的函式。因為大部分 dll 主要是為 c 和 c++ 程式設計師編寫和整理說明的,所以呼叫 dll 函式的方法與呼叫 vba 函式會有所不同。在使用 api 時必須了解如何給 dll 函式傳遞引數。

警告 呼叫 windows api 和 其他 dll 函式可能會給您的應用程式帶來不良影響。從自己的**中直接呼叫 dll 函式時,您繞過了 vba 通常提供的一些安全機制。如果在定義或呼叫 dll 函式時出現錯誤(所有程式設計師都不可避免),可能會在應用程式中引起應用程式錯誤(也稱為通用性保護錯誤,或 gpf)。最好的解決辦法是在執行**以前儲存該專案,並確保了解 dll 函式呼叫的原理。

lib 建立標準庫、導入庫和匯出檔案,在生成 32 位程式時可將它們與 link 一起使用。lib 從命令提示執行。

可在下列幾種模式下使用 lib:

生成或修改 coff 庫

將成員物件提取到檔案中

建立匯出檔案和導入庫

這些模式是互斥的;每次只能以一種模式使用 lib。

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...