首页 > 代码库 > Visual Studio 2015下编译zmq项目下其他项目踩进的项目引用坑

Visual Studio 2015下编译zmq项目下其他项目踩进的项目引用坑

PS.在之前的一篇文章中介绍了如何用Visual Studio 2015编译zmq,在编译同解决方案中除了libzmq之外的项目例如inproc_thr时会报错误,具如下:

Severity	Code	Description	Project	File	Line	Suppression StateError	LNK1181	cannot open input file ‘libzmq.lib‘	inproc_thr	E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\inproc_thr\LINK	1	

    找不到"libzmq.lib"!,怎么回事?。。。在此记录备忘

爬坑之路:

    (1)右键项目,build(编译),于是开始编译了,但是报错,无法打开文件"libzmq.lib",就像文章开头所提到的,对于vs2015的新特性来说首先想到的就是打开项目,然后点开Reference(引用),看看是否有引用,发现有。。。

    技术分享

    (2) 对于常规下同一个解决方案中创建的项目来说,直接在Reference中添加项目引用即可,他们会自动寻找项目底下的lib跟dll进行连接,但是zmq整个解决方案生成的结果却在根目录(本人的根目录为E:\zeromq4-1-master\zeromq4-1-master)底下的bin文件夹中,那么僵之前生成的lib文件和dll文件copy到libzmq目录下或者解决方案(本人目录为E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013)下面不就可以了吗?于是我这么做了。。。

    技术分享

    把lib和dll两个文件copy到libzmq目录下面,然后在项目inproc_thr项目右键Properties打开属性,在linker(连接器)-input(输入)-Additional Dependencies(添加依赖项)中添加了libzmq.lib,然后在linker-General-Additional Library Directories中添加了libzmq的路径,再次编译,结果还是报错了,及时放在解决方案的根目录之下依旧会出现,报错如下:

Severity	Code	Description	Project	File	Line	Suppression StateError	MSB3030	Could not copy the file "E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\inproc_thr\..\..\..\..\..\libzmq\bin\x64\Release\v140\dynamic\libzmq.dll" because it was not found.	inproc_thr	E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\libzmq.import.props	53	

  这个错误跟编译libzmq时因为缺失libsodium时爆出的错误几乎一摸一样,其实这个因为大意,不难发现添加Additional Library Directories(附加库目录)时,会发现Inherited Value(继承值)中内容如下

$(ProjectDir)..\..\..\..\..\libsodium\bin\$(PlatformName)\Release\$(PlatformToolset)\$(Linkage-libsodium)$(ProjectDir)..\..\..\..\..\libzmq\bin\$(PlatformName)\Release\$(PlatformToolset)\$(Linkage-libzmq)

  这个东西跟双击该编译错误时提示的libzmq.import.props中44行开始的编译过程一样,如下

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

     具体的内容解释可以参考zmq编译的那篇blog

      (3)具体解决方式如下,在zmq编译时提到的libsodium同目录之下建立一个文件夹,命名libzmq,如图

      技术分享

     然后将zeromq-4-1-master下编译zmq生成在根目录的bin文件夹整个拷贝进去,然后在inproc_thr项目再次右键,build,成功的编译过去了

2>------ Build started: Project: inproc_thr, Configuration: ReleaseDEXE x64 ------2>  ConfigurationType : Application2>  Configuration     : ReleaseDEXE2>  PlatformToolset   : v1402>  TargetPath        : E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\inproc_thr\..\..\..\..\bin\x64\Release\v140\dynamic\inproc_thr.exe2>  Linkage-libzmq    : dynamic2>  Linkage-libsodium : dynamic2>  inproc_thr.vcxproj -> E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\inproc_thr\..\..\..\..\bin\x64\Release\v140\dynamic\inproc_thr.exe2>  inproc_thr.vcxproj -> E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\inproc_thr\..\..\..\..\bin\x64\Release\v140\dynamic\inproc_thr.pdb (Full PDB)2>  Copying libzmq.dll -> E:\zeromq4-1-master\zeromq4-1-master\bin\x64\Release\v140\dynamic\libzmq.dll2>  Copying libsodium.dll -> E:\zeromq4-1-master\zeromq4-1-master\bin\x64\Release\v140\dynamic\libsodium.dll========== Build: 2 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

  在根目录(E:\zeromq4-1-master\zeromq4-1-master)的bin文件夹(E:\zeromq4-1-master\zeromq4-1-master\bin\x64\Release\v140\dynamic)下面生成了对应的pdb和exe可执行文档,如图

     技术分享

     至此,编译工作完成,对于剩余的其他项目照常执行编译即可,不需要其他的多余工作,也不需要在属性的linker里面添加库名称和目录之类的,编译组的几成熟型工作已经帮你完成了,libzmq.impoert.props文件在解决方案的根目录下面,但是同时也添加了一些莫名的麻烦,如果要在捷豹后重新创建解决方案组件工程师最方便的,但是需要了解以来结构来添加相应的文件。对于C++,Reference选项所产生的后果不如C#那么强烈,如果C#中,不是在共享项目中添加的项目引用,有些额外的文件更新会被忽略掉。

 

Visual Studio 2015下编译zmq项目下其他项目踩进的项目引用坑