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