當前位置:首頁 » 編程軟體 » dll編譯lib

dll編譯lib

發布時間: 2022-11-16 19:14:32

❶ C++中lib 和 dll 的區別,生成以及使用詳解

首先介紹一下靜態庫(靜態鏈接庫)、動態庫(動態鏈接庫)的概念,首先兩者都是代碼共享的方式。
靜態庫:在鏈接步驟中,連接器將從庫文件取得所需的代碼,復制到生成的可執行文件中,這種庫稱為靜態庫,其特點是可執行文件中包含了庫代碼的一份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最終生成的 EXE 文件中了。在vs中新建生成靜態庫的工程,編譯生成成功後,只產生一個.lib文件
動態庫:動態鏈接庫是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。在vs中新建生成動態庫的工程,編譯成功後,產生一個.lib文件和一個.dll文件
那麼上述靜態庫和動態庫中的lib有什麼區別呢?
靜態庫中的lib:該LIB包含函數代碼本身(即包括函數的索引,也包括實現),在編譯時直接將代碼加入程序當中
動態庫中的lib:該LIB包含了函數所在的DLL文件和文件中函數位置的信息(索引),函數實現代碼由運行時載入在進程空間中的DLL提供
總之,lib是編譯時用到的,dll是運行時用到的。如果要完成源代碼的編譯,只需要lib;如果要使動態鏈接的程序運行起來,只需要dll。

❷ 如何從動態庫DLL生成靜態的LIB並使用

在VS中創建一個解決方案,解決方案中包含一個庫項目,其餘所有的項目依賴這個庫項目,並且調用這個庫項目中的特定函數
/
LibProject/
UseLibProjectA/
UseLibProjectB/

知識准備

這樣的依賴關系可以採用靜態依賴庫lib和動態依賴庫dll實現,博主【技術先生】的一篇博客 1
簡明的闡述了兩者的區別,這里採用了靜態鏈接庫的方式。

操作過程

建立庫項目

  • 這里選用 [Visual C++] ->[空項目]

  • 修改項目屬性,[屬性]->[配置屬性]->[常規]->[項目默認值]->[配置類型]->[動態庫(.dll)]

  • 創建頭文件
    宏定義部分根據預編譯宏來區分編譯操作源自dll項目還是使用dll的項目
    所有的可能會被外部使用的變數或者方法都需要被[TESTDEPEND_API ]標注出來,博主曾經因為忘記把類默認初始方法標注出來而導致編譯失敗

  • #pragma once//TESTDEPEND_EXPORTS 這個宏名稱可以自由定義,#ifdef TESTDEPEND_EXPORTS #define TESTDEPEND_API __declspec(dllexport) #else #define TESTDEPEND_API __declspec(dllimport) #endif #include <string>class A {public: TESTDEPEND_API A(); TESTDEPEND_API void hello(std::string name);private : int c; int b;

  • };123456789101112131415161718

  • 生成方法實例

  • #include "A.h"#include <iostream>A::A() : b(1),c(2){}void A::hello(std::string name) { std::cout << b - c << "-hello-" << name << std::endl;}1234567891011

  • 添加編譯宏。 [屬性]->[配置屬性]->[C/C++]->[預編譯器]->[預編譯器定義] 添加TESTDEPEND_EXPORTS

  • 至此為止,庫項目創建完畢,我們可以直接編譯一遍該項目,根據默認配置,會在指定生成路徑下生成與項目名稱同名的dll和lib 文件。

    我們可以採用VS自帶的Dumpbin.exe 程序(在VS安裝目錄可以檢索到)檢查一下生成的dll文件中的內容,操作參考fengbingchun的博客 2 ,這個輸出的信息還是很難閱讀的,但是導出的方法名和相應的參數名還是可以清晰的推斷出來,我們可以人工檢查一下輸出的方法是否和預期一致。

    從其他項目中調用庫

  • 這里選用 [Visual C++] ->[空項目]

  • 包含頭文件, [屬性]->[配置屬性]->[VC ++目錄]->[包含目錄] 添加對應文件(.h)的路徑,如果可能的話,還是最好添加相對路徑,便於遷移

  • 包含庫文件路徑, [屬性]->[配置屬性]->[VC ++目錄]->[庫目錄] 添加對應文件(.lib)的路徑

  • 添加鏈接選項, [屬性]->[配置屬性]->[鏈接器]->[輸入] 添加對應文件(.lib)的名稱 e.g TestDepend.lib
    這一步是偷懶的操作,這樣添加的鏈接選項會針對每一個需要鏈接的文件生效,我們可以不配這一步,取而代之,我們在需要鏈接庫文件的地方寫下如下預編譯選項

    #pragma comment (lib,"TestDepend.lib")

  • 在項目中需要的地方調用庫文件的內容

  • //上面是對應的庫的頭文件名稱#include "A.h"//如果不在鏈接器的輸入中添加lib文件名,則需要按下面一行的方式配置//#pragma comment (lib,"TestDepend.lib")int main() { A a;


  • a.hello("t1");

  • a.hello("t2"); return 0;

  • }12345678910111213

  • 編譯並運行,項目運行成功

  • 在項目發布的時候我們需要將庫文件的lib和可執行文件exe放在同級目錄,lib文件則不需要了

❸ 如何由dll文件生成lib文件

�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語言函數,

❹ 如何通過dll文件生成對應的lib文件

方法/步驟
1
這里我用的是vs2008,網路下載vs2008,然後安裝,安裝界面如下圖所示。

2
安裝完成後是配置軟體的PATH,如下圖所示,右擊選擇「屬性」。

3
在彈出的窗口中選擇「高級系統設置」,如下圖所示。

4
然後如下圖所示,點擊「環境變數」。

5
在系統變數一欄中找到PATH,雙擊後就可以修改了。

6
在彈出的編輯窗口中輸入vc的bin路徑,然後保存退出。

7
打開windows下的控制台窗口CMD,進入到Dll所在的路徑。

8
執行以下命令生成一個def文件:
pexports mydll.dll -o > mydll.def

9
最後執行以下命令就可以生成一個lib文件了:
lib /machine:ix86 /def:mylib.def

❺ 如何在編譯器里設置調用別人寫好的lib和dll步驟

步驟:1.Tools->options->projects and solutions->VC++ directories分別在包含文件,庫文件填加了路徑

(這些路徑只告訴編譯器怎麼找文件,沒有說把那裡面的文件加入工程.)

(若不設置,編譯報錯:無法打開***文件)

2.Project->properties->c/c++->general->additional include directories 添加包含文件

Project->properties->linker->general->additional library directories 添加庫文件

Project->properties->linker->input->additional additional dependencies添加用到的lib

(這一步也可以在代碼中顯示調用 #pragma comment(lib, "***.lib") )

(若不添加,連接報錯:無法解析的外部符號)

3.將dll文件拷貝到工程debug文件下(如果不拷貝,編譯鏈接不報錯,運行報錯:無法找到***.dll)切記第三條,讓老子排查了一上午,當然最好把所有輸出目錄定位到一個文件下面。

附:

DLL與LIB文件的區別

共有兩種庫:
一種是LIB包含了函數所在的DLL文件和文件中函數位置的信息(入口),代碼由運行時載入在進程空間中的DLL提供,稱為動態鏈接 庫dynamic link library。
一種是LIB包含函數代碼本身,在編譯時直接將代碼加入程序當中,稱為靜態鏈接庫static link library。
共有兩種鏈接方式:
動態鏈接使用動態鏈接庫,允許可執行模塊(.dll文件或.exe文件)僅包含在運行時定 位DLL函數的可執行代碼所需的信息。
靜態鏈接使用靜態鏈接庫,鏈接器從靜態鏈接庫LIB獲取所有被引用函數,並將庫同代碼一起放到可執行文件 中。

關於lib和dll的區別如下:
(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裝載。

使用lib需注意兩個文件:
(1).h頭文件,包含 lib中說明輸出的類或符號原型或數據結構。應用程序調用lib時,需要將該文件包含入應用程序的源文件中。
(2).LIB文件,略。

使 用dll需注意三個文件:
(1).h頭文件,包含dll中說明輸出的類或符號原型或數據結構的.h文件。應用程序調用dll時,需要將該文件包含 入應用程序的源文件中。
(2).LIB文件,是dll在編譯、鏈接成功之後生成的文件,作用是當其他應用程序調用dll時,需要將該文件引入應用 程序,否則產生錯誤。如果不想用lib文件或者沒有lib文件,可以用WIN32 API函數LoadLibrary、GetProcAddress裝載。
(3).dll文件,真正的可執行文件,開發成功後的應用 程序在發布時,只需要有.exe文件和.dll文件,並不需要.lib文件和.h頭文件
望採納

❻ 關於c語言 dll文件和lib文件的問題

靜態鏈接 lib文件的二進制代碼最終要鏈接植入你的exe中
動態鏈接 dll文件內的二進制代碼不會植入你的exe中

靜態編譯 如果lib文件 的源碼修改了 編譯生成新的lib文件 那麼
新的lib文件要和你的源碼編譯得到的obj文件重新鏈接生成 新的exe
之前的exe就可以扔進回收站了

動態編譯 dll 的源碼修改了 重新編譯生成新的dll (dll的調用介面 保持不變)
你的源文件編譯 obj文件後鏈接生成exe exe是動態鏈接調用dll 的所以 你的源碼不需要重編譯 你的exe依然可以用,你要做的只是 過來替換一下 n個dll中發生變動的那k個 ,

❼ dll工程中如何生成lib文件

解決辦法:
在工程上右鍵 -> 添加 -> 新建項 -> 選"模塊定義文件(.def)" -> 隨便填寫個名字 -> 添加
重新編譯編譯就可生成.lib 文件了,
之後把添加的文件刪除就可以了.

❽ 如何通過dll文件生成對應的lib文件

通過dll文件生成對應的lib文件的方法

  1. 這里我用的是vs2008,網路下載vs2008,然後安裝。

  2. 安裝完成後是配置軟體的PATH,如下圖所示,右擊選擇「屬性」。

  3. 在彈出的窗口中選擇「高級系統設置」,如下圖所示。

  4. 然後如下圖所示,點擊「環境變數」。

  5. 在系統變數一欄中找到PATH,雙擊後就可以修改了。

  6. 在彈出的編輯窗口中輸入vc的bin路徑,然後保存退出。

  7. 打開windows下的控制台窗口CMD,進入到Dll所在的路徑。

  8. 執行以下命令生成一個def文件:pexports mydll.dll -o > mydll.def

  9. 最後執行以下命令就可以生成一個lib文件了:lib /machine:ix86 /def:mylib.def

❾ 如何由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的方法。

❿ vc如何在命令行方式下將dll轉換為lib(我真

因為採集卡的dll不支持CLR,不支持C#,你需要用C++,並用靜態鏈接,也就是你需要包含.h和.lib文件。 你試用一下TlbImp.exe吧,這是VS2005以上安裝的一個工具,你可以在文件搜索里把它找出來。然後用命令行把你所需的dll文件轉換為支持CLR、支持C#的dll文件,你在C#就可以添加這個dll了。具體用法可以用 TlbImp.exe -help 命令查看。

熱點內容
動圖在線壓縮 發布:2025-05-14 03:35:24 瀏覽:132
w7共享無法訪問 發布:2025-05-14 03:35:24 瀏覽:482
為什麼微信會出現賬號密碼錯誤 發布:2025-05-14 03:03:30 瀏覽:692
幻影腳本官網 發布:2025-05-14 03:01:13 瀏覽:826
servlet的webxml怎麼配置 發布:2025-05-14 02:51:46 瀏覽:772
怎麼取消手勢密碼 發布:2025-05-14 02:51:11 瀏覽:639
openvpn搭建vpn伺服器搭建 發布:2025-05-14 02:47:52 瀏覽:998
密碼忘了從哪裡找 發布:2025-05-14 02:39:09 瀏覽:548
我的世界什麼伺服器有前途 發布:2025-05-14 02:30:31 瀏覽:528
java程序反編譯 發布:2025-05-14 02:18:46 瀏覽:459