簡體   English   中英

我有 .lib 和 .dll 文件,但沒有 .h - 如何在其他 C++ 項目中使用這些庫中的方法?

[英]I have .lib and .dll files, but not .h - how to use methods from those libraries in other C++ project?

大家好!

我有以下情況:我需要從另一個非常大的項目(稱為B )中導入我的 Visual Studio 2019 C++ 項目(稱為A )方法。 實際上,我有一個用於此B項目的 .sol 文件,並且可以成功構建靜態庫 ( B.lib ) 以及動態 ( B.dll )。 一個問題是 - 我想從AB調用一些方法,但我不能只加載B的頭並在A 中創建一些類,它繼承了B 中所需的類以及所有需要的方法,因為B真的是一個非常大項目,在“主標題”中使用了很多自定義類,這些類剛剛合並到項目中,我真的會在嘗試導入標題時陷入困境,以使標題工作,以便使我的項目等中的“主要”標題工作。我想你明白了。

第二件事更具體:我嘗試使用LoadLibraryGetProcAdress加載 DLL。 有用。 實際上,對於我真正需要的所有方法,在B中,它定義了每個方法的 void 外部版本,它將指向類對象的指針作為參數。 一個問題是 - 如果B 中沒有工廠函數,如何獲取這個類的實例 - 即返回這個需要的類對象的指針的函數,我可以從 .dll 加載到我的A 中 我無法附加正確的代碼,因為它受 cw 保護。 也許 .lib 文件可以實現? 這對事物如何協同工作,這確實是我的問題。

那么,有什么辦法可以從這些庫中獲取方法嗎? 請更詳細地解釋一下,如果您有時間,我是 C++ 開發的大三學生,我並不總是清楚這意味着什么。 就像“只需鏈接 .lib 文件並使用它”-如何使用?..等等

預先感謝您的幫助!

靜態庫會增加二進制代碼的大小。 它們總是被加載,你編譯的代碼的任何版本都是將運行的代碼版本。

動態庫是單獨存儲和版本控制的。動態庫不一定加載——它們通常在第一次調用時加載——並且可以在使用相同庫的組件之間共享(多個數據加載,一個代碼加載)。

您可以根據需要選擇使用動態鏈接還是靜態鏈接。

使用靜態鏈接:要鏈接 .lib 文件,您只需要:

1、將頭文件的路徑添加到Additional Include Directories(property ->c/c++ -> General -> Additional Include Directories) 2、將.lib文件的路徑添加到Additional Library Directory(property -> linker) -> General -> Additional Library Directories) 3、將.lib 文件名及其擴展名添加到 Additional Dependencies (property -> linker -> input -> Additional Dependencies)

有關更多詳細信息,我建議您可以參考以下鏈接: https : //docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-static-library-cpp?view=vs- 2019年

使用動態鏈接:如果你有 a.dll 和 a.lib,你可以使用靜態加載的 dll。

1、將頭文件的路徑添加到Additional Include Directories(property ->c/c++ -> General -> Additional Include Directories) 2、將.lib文件的路徑添加到Additional Library Directory(property -> linker) -> General -> Additional Library Directories) 3, 將 .lib 文件的名稱及其擴展名添加到 Additional Dependencies (property -> linker -> input -> Additional Dependencies) 4,Add a Post-Build Event to your project,添加將 DLL 復制到構建輸出目錄的命令( Properties > Build Events > Post-Build Event )

有關更多詳細信息,我建議您可以參考以下鏈接: https : //docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view= vs-2019

如果 dll 沒有相應的 .lib 文件,則只能使用動態加載來加載 DLL。

1、創建一個函數指針,其指針數據類型與調用DLL導出函數相匹配。 2、通過Win32 API函數LoadLibrary()顯式調用DLL,該函數返回DLL的實例句柄。 3、通過Win32 API函數GetProcAddress()獲取要調用的DLL的函數地址,將結果賦值給自定義函數的指針類型。 4、使用函數指針調用DLL函數。 5、最后調用完成后,通過Win32 API函數FreeLibrary()釋放DLL函數。

有關更多詳細信息,我建議您可以參考以下鏈接: https : //docs.microsoft.com/zh-cn/windows/win32/dlls/using-run-time-dynamic-linking

這可以通過將 B 靜態鏈接到 A 來實現。首先您必須構建 B 的解決方案並獲取 lib 文件。 然后將lib文件作為附加依賴添加到A的項目中,最后將B的頭文件分開,將頭文件的位置添加到A的Additional Include Directories部分。

腳步:

  1. 構建B並獲取B.lib

  2. 從 B 的源代碼中將頭文件解壓縮到一個單獨的目錄中。 (我們稱這個目錄為 INC_DIR)

  3. 打開A的解決方案,右鍵單擊A的項目選擇屬性打開屬性窗口。
  4. 在屬性窗口中轉到 C/C++ -> Additional Include 目錄。 將 INC_DIR 的位置添加到 Additional Include 目錄
  5. 在屬性窗口轉到鏈接器 -> 常規 -> 附加庫目錄。 將 B.lib 的位置添加到其他庫目錄。
  6. 在屬性窗口轉到鏈接器 -> 輸入 -> 附加依賴項。 將 lib (B.lib) 的名稱添加到其他依賴項。

此鏈接清楚地顯示了該怎么做: https : //stackoverflow.com/a/23882710/5746085

在 Internet靜態庫鏈接 + Visual Studio上搜索以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM