簡體   English   中英

在 Visual Studio C++ 項目中包含源庫的正確方法是什么?

[英]What is the proper way to include a source library in a Visual Studio C++ project?

現在,我正在嘗試使用 Visual Studio 2019 在 C++ 中創建我的第一個“真實”項目。我需要包含一個第三方庫作為依賴項。 項目主頁上的說明只是建議將所有源/頭文件直接包含到項目中。 我的理解是這是一種不好的做法,因為最終結果在任何 VCS 中看起來都非常難看。

值得慶幸的是,庫作者還提供了調用 cl、lib 並與適當的 arguments 鏈接的構建腳本,並生成了令人垂涎的 foo.lib。 我將該文件添加到 linker 選項中的依賴項中,並在與編譯器/鏈接器選項進行了一番討論之后,終於讓它運行了。

令我苦惱的是,我意識到我已經在 Release 配置中完成了所有這些操作,這使我無法使用調試器。 然后我用 /MDd 構建了庫,修復了一些編譯器選項......並在 vcruntime.h 中得到了一個奇怪的編譯時錯誤( fatal error C1189: #error: _HAS_CXX17 and _HAS_CXX20 must both be defined, and _HAS_CXX20 must imply _HAS_CXX17 ) .

在這一點上,我知道我做錯了什么,因為包含一個簡單的庫不應該需要這么多的手動旋鈕調整。 在 Visual Studio(以及一般的 C++)中包含第三方依賴項的正確、規范的方法是什么? 假設 Nuget、vcpkg 或類似的依賴項不可用。

據我了解,您所做的事情是在 Windows 上。 首先,我建議您嘗試 linux 發行版。 在 windows 中可以運行 lib 文件,但並不容易。 如果您可以向我發送您正在使用的圖書館的鏈接,這將有所幫助。

通常的方法是將這些源代碼粘貼到他們自己的目錄和他們自己的 Visual Studio項目(不是解決方案)中。 這仍然可以構建一個 foo.lib。 你不需要很多選擇。

接下來,您只需告訴 Visual Studio 您自己的項目依賴於其他項目,然后它將為您鏈接foo.LIB

話雖如此,聽起來您嘗試為 C++ 版本構建具有不同設置的兩個項目。 VS2019對C++17的支持很好,對C++20的實驗性支持,大家可以選擇。 但是您需要為所有項目做出一致的選擇。

在更大的解決方案中,您可以為此使用一個 .vsprops 文件,這就像項目文件的#include一樣。 當你有兩個項目時有點矯枉過正,當你有 150 個項目時是救命稻草。

包含 3rd 方庫的方式會有所不同,有時 3rd 方庫有安裝並像在 Common Components 下一樣自行安裝,有時您必須手動完成。

E.g. YourSolution/3rdParty/foo/include
     YourSolution/3rdParty/foo/lib 
     YourSolution/3rdParty/foo/lib/release 
     YourSolution/3rdParty/foo/lib/debug

有時庫有不同的名稱,然后它們可能在同一個文件夾中。

一旦你將結構 go 添加到項目的屬性 C/C++ 中,並在 Additional Include Directories 下添加包含,請確保此處具有配置“所有配置”。 然后 go 到項目屬性/鏈接器/輸入以及調試配置和發布配置的依賴項 - 因為通常它們是每個配置的不同庫。 例如 release/foo.lib 和 debug/foo.lib (foo.lib foo-d.lib 或其他名稱)。

使用宏確保您獲得正確的位置,以便它們與您的解決方案和項目相關。 絕對路徑不好。 例如$(SolutionDir)3rdparty\foo\include

免責聲明:我不確定這是不是“最佳”方式,但我就是這樣做的。

暫無
暫無

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

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