簡體   English   中英

將 OpenSSL 靜態庫添加到 Visual Studio 2017 項目

[英]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')) &gt; -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.liblibcrypto.Lib導入AdditionalDependencies節點的操作。 但是你可以發現有一個判斷條件And '$(Configuration)' == 'Debug' ,因為你沒有$(Configuration) ,所以它總是返回false並且這些庫不能自動導入到AdditionalDependencies

作為一種解決方法,您應該像您所說的那樣手動添加這些 lib 路徑。

而且我確信如果您使用包含$(Configuration) (調試或發布)的項目,您將不會遇到此問題。 並且大部分 C++ nuget 包都可以直接在包含Configuration節點的項目中使用。

我確信如果你在你的項目中使用$(Configuration)然后重新安裝這個包(請在做之前清理 nuget 緩存),你不會遇到這個錯誤。

另外,你的屏幕截圖,你從哪里得到的? 我在 VS 輸出控制台中或在命令行上運行 msbuild 時都看不到類似的內容。 有什么方法我可能不小心破壞了默認行為?

您可以將MSBuild project build output verbosityDiagnostic by Tools --> Options --> Projects and Solutions --> Build and Run

當您構建項目時,輸出窗口會顯示整個構建過程並記錄所有信息,然后您可以通過輸出窗口上的搜索框搜索關鍵字段。

暫無
暫無

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

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