win10下Visual Studio 2015,C++ x64編譯zmq

PS.本人編譯過程踩得坑,記錄備忘html

下載:(1)官網:http://zeromq.org/intro:get-the-software,有簡明的編譯方式,cmake的,這裏很少贅述git

         (2)到GitHub下載,https://github.com/zeromq,本人下載時是4.1.x stable,在https://github.com/zeromq/zeromq4-1github

準備:首先將下載的源碼包解壓,到任意目錄,本人解壓獲得的根目錄爲E:\zeromq4-1-master\zeromq4-1-masterapi

編譯:優化

         (1)在根目錄下,有個builds文件夾,打開後再打開裏面的msvc文件夾,裏面有vs2008到vs2013的工程文件夾,鑑於本人使用的是vs2015,因此,選擇打開vs2013的工程,雙擊libzmq.sln打開解決方  案,會提是須要修改配置文件,點擊肯定便可,修改好後會自動加載項目ui

          

          (2)在菜單欄的目標平臺選擇x64,而在配置選項裏面有6個選項,分爲3大類,Dyn、Static、Ltcg,Dyn表示動態庫,Static表示靜態庫,Ltcg則是一個比較陌生的選項,這個在微軟的msdn文檔裏面有詳細介紹:https://msdn.microsoft.com/en-us/library/xbf3tbeh.aspx。加密

          --->簡要說明:/LTCG,連接時代碼生成,因爲在連接時生成代碼,能夠全局地對全部obj進行優化. 通常用於release版的生成. 該選項與增連連接 (https://msdn.microsoft.com/zh-cn/library/4khtbfyf.aspx微軟的msdn中有介紹,關於這個的詳細說明,引用一篇園友的文章:http://www.cnblogs.com/Dahaka/archive/2011/08/01/2124256.html) 是衝突的.開啓了連接時代碼生成,即使在增連連接開啓的狀況下,仍然要進行完整連接.爲了讓Debug版本生成速度不變慢,請保持debug版本不使用連接時生成代碼選項.而且也不要依賴帶有/ltcg選項生成的庫。其編譯的結果爲lib文件。<---spa

          本人編譯動態連接庫,因此使用的DynRelease選項,而後在libzmq項目處點擊右鍵,選擇build(編譯),此時開始編譯,可是在中途就會報錯,以下.net

Severity	Code	Description	Project	File	Line	Suppression State
Error	LNK1181	cannot open input file 'libsodium.lib'	libzmq	E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\libzmq\LINK	1	

       提示沒法代開libsodium.lib,這是一個是一個先進並且易用的加密庫。主要用於加密、解密、簽名和生成密碼哈希等等。這是一個可移植的、跨編譯器支持、可安裝的,基於 NaCI 開發,提供一個兼容 API。此時雙擊錯誤能夠看到指示的編譯語句以下,在libsodium.import.props的30行開始debug

<Target Name="Linkage-libsodium-dynamic" AfterTargets="AfterBuild" Condition="'$(Linkage-libsodium)' == 'dynamic'">
    <Copy Condition="$(Configuration.IndexOf('Debug')) != -1"
          SourceFiles="$(ProjectDir)..\..\..\..\..\libsodium\bin\$(PlatformName)\Debug\$(PlatformToolset)\dynamic\libsodium.dll"
          DestinationFiles="$(TargetDir)libsodium.dll"
          SkipUnchangedFiles="true" />
    <Copy Condition="$(Configuration.IndexOf('Debug')) != -1"
          SourceFiles="$(ProjectDir)..\..\..\..\..\libsodium\bin\$(PlatformName)\Debug\$(PlatformToolset)\dynamic\libsodium.pdb"
          DestinationFiles="$(TargetDir)libsodium.pdb"
          SkipUnchangedFiles="true" />
    <Copy Condition="$(Configuration.IndexOf('Release')) != -1"
          SourceFiles="$(ProjectDir)..\..\..\..\..\libsodium\bin\$(PlatformName)\Release\$(PlatformToolset)\dynamic\libsodium.dll"
          DestinationFiles="$(TargetDir)libsodium.dll"
          SkipUnchangedFiles="true" />
  </Target>

       此處(ProjectDir)..\..\..\..\..\libsodium,其中的..\有五個,而props文件所在的目錄爲解決方案全部項目的根目錄,此處編譯工程爲(ProjectDir)-libzmq,如圖

            

          其目錄爲E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\libzmq,那麼..\返回父目錄五次,則回到了E:\zeromq4-1-master(注意開頭時的解壓根目錄)

          (3)下載libsodium,直接到github下載便可https://github.com/jedisct1/libsodium,下載解壓後,本人解壓根目錄爲E:\libsodium-master,打開根目錄下的E:\libsodium-master\builds\msvc的vs2015,雙擊libsodium.sln,configuration(配置)選擇DynRelease,平臺選擇x64,而後編譯便可,過程很快,由於沒有其餘的以來,因此編譯過成不會有差錯。在根目錄會生成bin文件夾,編譯的結果就在裏面。至此,本人認爲在libzmq項目將libsodium路徑包含進去便可,可是如步驟(2)處的props文件的內容,這樣作並不會成功。

          正確的作法:將編譯後的整個根文件夾libsodium-master拷貝到E:\zeromq4-1-master,而且更名爲libsodium,此時的E:\zeromq4-1-master有兩個文件夾,一個是libsodium(libsodium的根目錄),一個爲zeromq4-1-master(zmq的根目錄),如圖

           

          此時,libsodium的編譯結果就如props文件描述的一致,結果在 ..\..\..\..\..\libsodium 的 E:\zeromq4-1-master\libsodium\bin\x64\Release\v140\dynamic,對應的PlatformName爲x64,PlatformToolset爲v140,在下面的文件跟須要複製引用的內容一致,如圖:

           

          PS.若是不想連接這個依賴庫的話,右鍵libzmq項目,打開properties(屬性),在左側菜單欄的Local Depandencies(本地依賴項)中選中libsodium,而後選擇not link就能夠了,如圖:

          

          (4)以上工做準備好了以後,再次進行第二步的編譯,就能夠順利的完成了,結果以下

1>------ Build started: Project: libzmq, Configuration: ReleaseDLL x64 ------
1>  ConfigurationType : DynamicLibrary
1>  Configuration     : ReleaseDLL
1>  PlatformToolset   : v140
1>  TargetPath        : E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\libzmq\..\..\..\..\bin\x64\Release\v140\dynamic\libzmq.dll
1>  Option-openpgm    :
1>  Option-sodium     : true
1>  Option-gssapi     :
1>  Linkage-libsodium : dynamic
1>     Creating library E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\libzmq\..\..\..\..\bin\x64\Release\v140\dynamic\libzmq.lib and object E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\libzmq\..\..\..\..\bin\x64\Release\v140\dynamic\libzmq.exp
1>  libzmq.vcxproj -> E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\libzmq\..\..\..\..\bin\x64\Release\v140\dynamic\libzmq.dll
1>  libzmq.vcxproj -> E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\libzmq\..\..\..\..\bin\x64\Release\v140\dynamic\libzmq.pdb (Full PDB)
1>  Copying libsodium.dll -> E:\zeromq4-1-master\zeromq4-1-master\bin\x64\Release\v140\dynamic\libsodium.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

       在根目錄下也會出現一個bin文件在,結果在E:\zeromq4-1-master\zeromq4-1-master\bin\x64\Release\v140\dynamic裏面:

           

             至此,編譯完成,使用時須要include的頭文件在E:\zeromq4-1-master\zeromq4-1-master\include裏面,有zmq.h和zmq_utils.h

相關文章
相關標籤/搜索