最近在學習curl庫時,碰到一個問題,從官網上下載了一個lib版的,卻發現只有.dll,沒有lib檔案,感覺很奇怪,google了之後才知道,原來庫作者的用意是讓使用者自己產生lib檔案,下載到的lib檔案中含有.def檔案。唉,用了vs有幾個年頭了,卻連這麼基礎的問題都不知道,編譯器是變得越來越智能了,只是讓我們變得越來越傻了。下邊我總結了一下由.def產生lib的方法。
在使用 VC 連結 dll 時,通常需要一個匯入庫檔案(.lib),但有時我們只有一個 dll 檔案,怎麼辦呢?
通常,在連結庫檔案時,需要一個 (.lib)檔案,lib 檔案分為兩種:一種為靜態連結庫(Static Libary,以下簡稱“靜態庫”),另一種為動態串連庫(DLL,以下簡稱“動態庫”)的匯入庫(Import
Libary,以下簡稱“匯入庫”)。VC 在連結 dll 時,需要根據匯入庫(.lib)來定位 dll 中的符號位置。沒有這個檔案,VC 連結器將不能正常連結。
解決此問題的辦法有三個:
- 使用 DLL to Lib 工具,根據 dll 檔案產生 lib 檔案。
- 使用 LoadLibrary 函數載入 dll 檔案,再使用 GetProcAddress 來尋找函數地址,根據得到的函數指標來進行調用。
- 編寫模組定義檔案(.def),使用命令列產生 lib 檔案。
以下重點介紹使用模組定義檔案來產生 lib 的方法。
模組定義檔案是用來描述 dll 檔案的文字格式設定的檔案,其格式如下:
LIBRARY libdll.dll ;dll 檔案的檔案名稱
DESCRIPTION "描述資訊" ;描述資訊,此行可以不要
EXPORTS
lib_add @1 ;函數描述
lib_sub @2 ;函數描述
第一行:在 LIBRARY 後面填 dll 檔案的名字,分號後面是注釋。
第二行:DESCRIPTION,描述資訊,此行可以忽略
第三行:EXPORTS
第四行開始,是 dll 檔案中函數的描述,可以使用 dumpbin /EXPORTS libdll.dll 命令查看,(其中,libdll.dll 是目標 dll 的檔案路徑)
以上檔案寫好後,儲存成 libdll.def 檔案,放在和 dll 檔案相同的目錄。
使用 lib /def:libdll.def 命令,可以產生 lib 檔案。