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

相关文章
相关标签/搜索