[英]Add OpenSSL static lib to Visual Studio 2017 project
添加到項目時,NuGet 是否會修改包含和鏈接路徑?
我的背景是 CMake,在那里這些東西很簡單,但我現在在一家從頭開始構建解決方案文件的公司,我不確定如何將靜態 OpenSSL 庫正確添加到我的項目中。 我發布問題是為了確保我不會重復某些內容或以其他方式將其搞砸。
當我將openssl-vc141-static-x86_64 添加到我的項目時,它會構建.lib
文件和所有內容,但不會修改包含或鏈接器路徑。
我可以手動添加鏈接器路徑,但是因為給我的項目沒有典型的Release
/ Debug
配置,我不能使用$(Configuration)
宏來指向目標庫 - 所以我只是指向在Release
。 構建雖然有效。
我看到有一個.targets
文件,但它似乎沒有做任何事情。
(更新)
具體來說,我基本上是在構建 boost 的http_server_async.cpp 。 我得到的鏈接器錯誤是:
Error LNK2019 unresolved external symbol _BIO_free referenced in function "public: __thiscall boost::asio::ssl::context::bio_cleanup::~bio_cleanup(void)" (??1bio_cleanup@context@ssl@asio@boost@@QAE@XZ) ESOIPDataScope C:\gitrepo\ALIDB\ESOIPDataScope\DataHandler.obj
Error LNK2001 unresolved external symbol _BIO_free ESOIPDataScope C:\gitrepo\ALIDB\ESOIPDataScope\Listener.obj
... (48 more like this)
當我手動添加$(SolutionDir)packages\\openssl-vc141-static-x86_64.1.1.0\\build\\native\\lib\\Win32\\static\\Release\\libcrypto.lib
和$(SolutionDir)packages\\openssl-vc141-static-x86_64.1.1.0\\build\\native\\lib\\Win32\\static\\Release\\libssl.lib
是項目編譯的附加依賴項。
(/更新)
只是為了對比,我添加了一個 freeglut NuGet,並注意到它給了我更多的配置選項(配置屬性→引用項目),而且,boost 似乎已經將它的鏈接器目錄添加到我的項目中(盡管我只在 MSBuild 輸出中看到,而不是在配置屬性->鏈接器->命令行)
有沒有合適的方法來添加我缺少的這些項目? 或者使用targets
文件的正確方法? 或者也許 OpenSSL 靜態 NuGet 只是缺少一些東西? 或者我應該看看vcpkg?
添加到項目時,NuGet 是否會修改包含和鏈接路徑?
當然。 我可以明確地告訴您,nuget 通過<package_id>.targets
或<package_id>.props
文件將其他屬性導入到項目中,而不是再次手動添加包含路徑。
這是nuget打包的一種機制,用於在nuget包的安裝過程中直接向項目添加額外的項目屬性,例如庫路徑。 更多信息你可以參考這個鏈接。
<package_id>.targets
是在打包 nuget 包的過程中創建的。 也就是說,這個方法是由nuget包的作者設計的。 在我這邊,文件openssl-vc141-static-x86_64.targets
存在於以下路徑中:
C:\Users\Admin\source\repos\ConsoleApplication25\packages\openssl-vc141-static-x86_64.1.1.0\build\native
此外,boost 似乎已將其鏈接器目錄添加到我的項目中(盡管我只在 MSBuild 輸出中看到,而不是在 Configuration Properties->Linker->Command Line 中)
我認為這個問題與<package_id>.targets
和<package_id>.props
之間的差異有關。 盡管使用<package_id>.targets
不會出現在屬性 UI 上,但它仍然適用於整個項目。
更詳細
當您將 nuget 包安裝到項目中時,這些文件會自動執行。 <target_id>.props
文件添加在文件頂部,而 .targets 文件添加在底部。
初始化xxx.vcxproj
文件時,因為<package_id> .props
在文件的頭部,屬性UI可以捕獲文件中的屬性,而<package_id> .targets
在最后,所以無法捕獲初始化但仍在項目中。 對於 nuget,它使用openssl-vc141-static-x86_64.targets
。
在openssl-vc141-static-x86_64.targets
文件中,你可以看到:
<ClCompile>
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include\;%
(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>HAS_LIBTHRIFT;%(PreprocessorDefinitions)
</PreprocessorDefinitions>
</ClCompile>
我已將輸出日志設置為Diagnostic
並構建項目並發現:
庫路徑已由openssl-vc141-static-x86_64.targets
文件自動添加到AdditionalIncludeDirectories
。 所以你不必擔心。
有沒有合適的方法來添加我缺少的這些項目? 或者使用目標文件的正確方法? 或者也許 OpenSSL 靜態 NuGet 只是缺少一些東西? 或者我應該看看vcpkg?
您無需擔心,也不要將包含路徑添加到項目屬性中。 這是多余的,當你安裝完這個 nuget 包后,直接在 cpp 文件中使用它。
此外,
對於 nuget 安裝的 c++ 包,您不需要向項目屬性添加任何路徑。
更新 1
該問題與您的項目有關,而不是與 nuget 包有關。 正是因為你當前的項目沒有$(Configuration)
,所以在openssl-vc141-static-x86_64.targets
,你可以看到這些:
<ItemDefinitionGroup Label="Win32 and vc141 and Debug" Condition="'$(Platform)' == 'Win32' And ( $(PlatformToolset.IndexOf('v141')) > -1 Or '$(PlatformToolset)' == 'WindowsKernelModeDriver8.0' Or '$(PlatformToolset)' == 'WindowsApplicationForDrivers8.0' Or '$(PlatformToolset)' == 'WindowsUserModeDriver8.0' ) And '$(Configuration)' == 'Debug'">
<Link>
<AdditionalLibraryDirectories>$(MSBuildThisFileDirectory)lib\Win32\static\Debug\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>libssl.lib;libcrypto.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>xcopy /Y "$(MSBuildThisFileDirectory)\lib\Win32\dynamic\*-1_1.dll" "$(OutDir)"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
這是將特定的libssl.lib
和libcrypto.Lib
導入AdditionalDependencies
節點的操作。 但是你可以發現有一個判斷條件And '$(Configuration)' == 'Debug'
,因為你沒有$(Configuration)
,所以它總是返回false並且這些庫不能自動導入到AdditionalDependencies
。
作為一種解決方法,您應該像您所說的那樣手動添加這些 lib 路徑。
而且我確信如果您使用包含$(Configuration)
(調試或發布)的項目,您將不會遇到此問題。 並且大部分 C++ nuget 包都可以直接在包含Configuration
節點的項目中使用。
我確信如果你在你的項目中使用$(Configuration)
然后重新安裝這個包(請在做之前清理 nuget 緩存),你不會遇到這個錯誤。
另外,你的屏幕截圖,你從哪里得到的? 我在 VS 輸出控制台中或在命令行上運行 msbuild 時都看不到類似的內容。 有什么方法我可能不小心破壞了默認行為?
您可以將MSBuild project build output verbosity
為Diagnostic
by Tools
--> Options
--> Projects and Solutions
--> Build and Run
。
當您構建項目時,輸出窗口會顯示整個構建過程並記錄所有信息,然后您可以通過輸出窗口上的搜索框搜索關鍵字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.