A. 關於c語言 dll文件和lib文件的問題
靜態鏈接 lib文件的二進制代碼最終要鏈接植入你的exe中
動態鏈接 dll文件內的二進制代碼不會植入你的exe中
靜態編譯 如果lib文件 的源碼修改了 編譯生成新的lib文件 那麼
新的lib文件要和你的源碼編譯得到的obj文件重新鏈接生成 新的exe
之前的exe就可以扔進回收站了
動態編譯 dll 的源碼修改了 重新編譯生成新的dll (dll的調用介面 保持不變)
你的源文件編譯 obj文件後鏈接生成exe exe是動態鏈接調用dll 的所以 你的源碼不需要重編譯 你的exe依然可以用,你要做的只是 過來替換一下 n個dll中發生變動的那k個 ,
B. LIB文件和DLL文件有什麼不同
(1)lib是編譯時需要的,dll是運行時需要的。
如果要完成源代碼的編譯,有lib就夠了。
如果也使動態連接的程序運行起來,有dll就夠了。
在開發和調試階段,當然最好都有。
(2)一般的動態庫程序有lib文件和dll文件。lib文件是必須在編譯期就連接到應用程序中的,而dll文件是運行期才會被調用的。如果有dll文件,那麼對應的lib文件一般是一些索引信息,具體的實現在dll文件中。如果只有lib文件,那麼這個lib文件是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib文件有好處:給用戶安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程序比較大,而且失去了動態庫的靈活性,在版本升級時,同時要發布新的應用程序才行。
(3)在動態庫的情況下,有兩個文件,一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數和數據並不復制到可執行文件中,因此在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的內存地址,這樣當一個或多個應用程序運行是再把程序代碼和被調用的函數代碼鏈接起來,從而節省了內存資源。從上面的說明可以看出,DLL和.LIB文件必須隨應用程序一起發行,否則應用程序將會產生錯誤。
C. LIB和DLL的區別與使用
第一:.DLL是動態鏈接庫,而.LIB是靜態鏈接庫
dll是個編譯好的程序,調用時可以直接調用其中的函數,不參加工程的編譯. 而lib應該說是一個程序集, 只是把一些相應的函數總結在一起, 如果調用lib中的函數,在工程編譯時,這些調用的函數都將參加編譯.
第二:從內存管理的角度來看,lib必須被鏈接到主程序中,主程序進入內存,lib也同時進入內存。而dll則是需要用到它的時候由操作系統調入內存。從復用性的角度來看,lib因為必須參加編譯,所以復用性就不如DLL
D. 有的程序為何只有dll沒有lib
首先,dll的調用不一定需要*.lib這個引入庫。
dll調用分為兩種方式,一是隱式鏈接,二是顯式鏈接。隱式鏈接就是使用*.lib的,這就需要在編譯的時候有這個lib文件。而顯式鏈接,就是使用LoadLibrary這個API函數來實現動態載入,因此,不需要lib這樣的引入庫。
再者,就算是使用隱式鏈接,lib只是在編譯的時候確定DLL介面,使得調用者可以很便捷地使用dll文件,但在發布的時候,是不需要連同lib一起發布。
如果你要發布一個dll形式的SDK,就很有必要將頭文件,dll文件連同引入庫一起發布,以方便使用者調用。
E. C++中lib 和 dll 的區別,生成以及使用詳解
首先介紹一下靜態庫(靜態鏈接庫)、動態庫(動態鏈接庫)的概念,首先兩者都是代碼共享的方式。
靜態庫:在鏈接步驟中,連接器將從庫文件取得所需的代碼,復制到生成的可執行文件中,這種庫稱為靜態庫,其特點是可執行文件中包含了庫代碼的一份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最終生成的 EXE 文件中了。在vs中新建生成靜態庫的工程,編譯生成成功後,只產生一個.lib文件
動態庫:動態鏈接庫是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。在vs中新建生成動態庫的工程,編譯成功後,產生一個.lib文件和一個.dll文件
那麼上述靜態庫和動態庫中的lib有什麼區別呢?
靜態庫中的lib:該LIB包含函數代碼本身(即包括函數的索引,也包括實現),在編譯時直接將代碼加入程序當中
動態庫中的lib:該LIB包含了函數所在的DLL文件和文件中函數位置的信息(索引),函數實現代碼由運行時載入在進程空間中的DLL提供
總之,lib是編譯時用到的,dll是運行時用到的。如果要完成源代碼的編譯,只需要lib;如果要使動態鏈接的程序運行起來,只需要dll。
F. 電腦不在身邊,看書看得不是明白,是不是dll文件其實不需要.lib文件,只帶一個.h也能分發到別人的項目里
其實就是沒有lib,沒有h,一個dll文件也是可以給別人使用的,就是用起來麻煩些,LoadLibrary,定義函數指針,再GetProcAddress,一樣沒問題的。
G. dll庫和lib庫有什麼區別
關於dll庫和lib庫的區別如下:
1、使用場景不同:lib是編譯時用到的,dll是運行時用到的。
如果要完成源代碼的編譯,只需要 lib;如果要使動態鏈接的程序運行起來,只需要dll。
2、用途不同:如果有dll文件,那麼lib一般是一些索引信息,記錄了dll中函數的入口和位 置,dll中是函數的具體內容;如果只有lib文件,那麼這個lib文件是靜態編譯出來的,索引和實現都在其中。
使用靜態編譯的lib文件,在運行程序時 不需要再掛動態庫,缺點是導致應用程序比較大,而且失去了動態庫的靈活性,發布新版本時要發布新的應用程序才可以。
3、應用對象不同:動態鏈接的情況下,有兩個文件:一個是LIB文件,一個是DLL文件。LIB包含被DLL導出的函數名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到DLL 文件。
在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中相應函數代碼的地址,從而節省了內存資源。
DLL和LIB文件必須隨應用程序 一起發行,否則應用程序會產生錯誤。如果不想用lib文件或者沒有lib文件,可以用WIN32 API函數LoadLibrary、GetProcAddress裝載。
(7)dll編譯需要lib嗎擴展閱讀:
dll庫和lib庫使用方法:
1、使用lib的方法:
靜態lib中,一個lib文件實際上是任意個obj文件的集合,obj文件是cpp文件編譯生成的。在編譯這種靜態庫工程時,不會遇到鏈接錯誤;即使有錯,也只會在使用這個lib的EXT文件或者DLL工程里暴露出來。
在VC中新建一個static library類型的工程Lib,加入test.cpp文件和test.h文件(頭文件內包括函數聲明),然後編譯,就生成了Lib.lib文件。
2、使用dll的方法:
使用動態鏈接中的lib,不是obj文件的集合,即裡面不會有實際的實現,它只是提供動態鏈接到DLL所需要的信息,這種lib可以在編譯一個DLL工程時由編譯器生成。
參考資料來源:網路—lib
參考資料來源:網路—dll
H. 對話框程序生成的exe,為什麼不需要lib dll也能運行
Use MFC as Static
MFC基礎問題,lib是編譯到exe中的,所以使用靜態庫,就不需要MFC支持文件了。
不是只有對話框程序,文檔視圖結構的也一樣。
I. 如何由dll文件生成lib文件
編號: QA004062�0�2�0�2�0�2�0�2�0�2所屬類別: C/C++ - 其他方面
�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2 操作系統:windows
�0�2�0�2�0�2 編程工具:visual c++
�0�2�0�2�0�2 水平:剛入門(yijiong shi)�0�2
�0�2�0�2�0�2
�0�2�0�2�0�2�0�2 .lib有兩種,一種是靜態的,其中包括函數的實際代碼,
一種是由DLL生成的.lib,其中並不包含代碼,
只是包含DLL的鏈接信息。只有前一種才存在你說的轉換問題。
另外一點要看.lib中的內容,如果是普通的C語言函數,
可以轉換,如果是C++類,則不能直接轉換為DLL,
因為即使你直接編譯為DLL,也只有VC的程序才能使用(
那何必費這事),即使C++ Builder也不能調用,你必須把類轉換為普通的C語言函數,
你可以參考QA000072 VB和VC混合編程中編寫DLL的方法。
J. 編譯dll為什麼沒有lib文件產生
動態庫編譯完之後是要一個exe和這個dll同時在才能運行。好處?dll可以動態載入,也可以被多個程序調用,lib庫存在版本必須一致的問題,例如2008的代碼連接的時候必須要連接2008編譯出來的lib庫,而dll或許不需要這么強制對應。