Visual Studio 2015下编译zmq项目下其他项目踩进的项目引用坑
PS.在之前的一篇文章中介绍了如何用Visual Studio 2015编译zmq,在编译同解决方案中除了libzmq之外的项目例如inproc_thr时会报错误,具如下:
Severity Code Description Project File Line Suppression State
Error 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(引用,其实当时对于C++的reference不了解,这个引用时会在libzmq继承很多项目包括编译的属性的),看看是否有引用,发现有。。。

(2) 对于常规下同一个解决方案中创建的项目来说,直接在Reference中添加项目引用即可,他们会自动寻找项目底下的lib跟dll进行连接,但是zmq整个解决方案生成的结果却在根目录(本人的根目录为E:\zeromq4-1-master\zeromq4-1-master)底下的bin文件夹中,那么将之前生成的lib文件和dll文件(包括libsodium的)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 State
Error 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(继承值,注意上面步骤(1)中的绿色标记字)中内容如下,这个内容是从libzmq的项目中继承过来的,因为在项目Reference中,inproc_thr引用了libzmq
$(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)具体解决方式如下:
解决1:最简单粗暴的就是把根目录的名字从zeromq4-1-master改成libzmq即可(下面的内容可以忽略不看)
解决2:在项目的reference中将libzmq去掉,在inker(连接器)-input(输入)-Additional Dependencies(添加依赖项)中可以不用添加libzmq.lib,因为这是必须依赖项,编译组在编译工作中预先写入;然后 重复步骤(2)的过程,如果拷贝libzmq和libsodium的lib以及dll到libzmq目录下,必须在linker-General-Additional Library Directories(附加库目录)中必须将libzmq项目目录添加进去,可选择把inherited value那一项的钩去掉,如果是拷贝到inproc_thr目录下面,则可以免去这个工作,然后编译就会显示编译成功!
解决3:如果你有很多个zmq的版本,要区分以前版本的zmq,想要保持现在文件结构名字,
可以参考如下做法:
在zmq编译时提到的libsodium同目录之下建立一个文件夹,命名libzmq,如图

然后将zeromq-4-1-master下编译zmq生成在根目录的bin文件夹整个拷贝进去,然后在inproc_thr项目再次右键,build,成功的编译过去了
2>------ Build started: Project: inproc_thr, Configuration: ReleaseDEXE x64 ------
2> ConfigurationType : Application
2> Configuration : ReleaseDEXE
2> PlatformToolset : v140
2> TargetPath : E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\inproc_thr\..\..\..\..\bin\x64\Release\v140\dynamic\inproc_thr.exe
2> Linkage-libzmq : dynamic
2> Linkage-libsodium : dynamic
2> inproc_thr.vcxproj -> E:\zeromq4-1-master\zeromq4-1-master\builds\msvc\vs2013\inproc_thr\..\..\..\..\bin\x64\Release\v140\dynamic\inproc_thr.exe
2> 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.dll
2> 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项目下其他项目踩进的项目引用坑的更多相关文章
- 用Visual Studio 2015成功编译、发布UMDF驱动到目标机!!
开发工具:Visual Studio 2015企业版 主 机:windows10 X64企业版,主机是安装了Visual Studio 2015的操作系统,主要进行驱动开发和调试. 目 标 ...
- Visual Studio 2015 Tools for Unity使用基础
Unity4.x编辑器侧 具体版本号:Visual Studio 2015 Tools for Unity 3.7.0.1 该插件在:Microsoft Visual Studio Tools for ...
- win10下Visual Studio 2015,C++ x64编译zlib
前提安装了visual studio 2015 PS.几乎所有方式,x64的编译都会有点坑,鉴于网上的x86编译方式非常的多,所以不再累赘x86的编译方式 zlib下载源: 官网:http: ...
- .NET Core 在Visual Studio 2015 下的使用-MSDN
.NET Core RC2 现已推出,这是真正的"候选发布"而非 RC1 Beta 冒充的候选发布(如果是那样,请考虑发布后出现的所有更改).当前,围绕 .NET Core 的开发 ...
- 【转载】Visual Studio 2015 for Linux更好地支持Linux下的开发
原文:Visual Studio 2015 for Linux更好地支持Linux下的开发 英文原文:Targeting Linux Made Easier in Visual Studio 2015 ...
- Win7下使用Visual Studio为WinXP编译可执行文件
造冰箱的大熊猫@cnblogs 2019/8/5 2019/9/5补充:参见这里 1.问题 开发机是64位Win7,想开发能够运行在WinXP下的C程序,怎么办? 2.解决方法 一个简单粗暴的解决办法 ...
- win10 下visual studio 2015 在调试模式下不能跟踪源文件
win10 下visual studio 2015 在调试模式下不能跟踪源文件,只要一调试就会关闭(隐藏)打开的文档,非常不方便.经过一番折腾,发现是配置的问题. 如果安装多个版本的VS,请删除对应版 ...
- ubuntu下使用visual studio code来编译和调试C++
最近想在linux上编译c++代码,自己却一直习惯window上的IDE.以前公司要我写Linux代码的时候,我一般都是用eclipse + CDT,而eclipse这东西吧,我个人感觉因为加载组件太 ...
- visual studio 2015下python编程的中文字符串问题
visual studio 2015强大的编程功能,编写起python来也是非常方便的,但其对中文字符的支持不是很好,经常发生莫名其妙的错误,最常见的错误是不报错,也不执行代码. 代码简单如下: x= ...
随机推荐
- RUP你知道多少?
RUP 相信学UML的同学,对此都很耳熟,当然也眼熟,可是,对于RUP,你了解多少呢? 首先,什么是RUP? RUP是Rational UnifiedProcess,统一软件开发过程,是一个面向对象且 ...
- VB查询数据库之结账——机房收费系统总结(五)
对于机房收费的结账,我感觉是所有窗体中,最难的一个.这个窗体我真的做了好多天.它的难度系数我感觉是最高的. 首先,你要理清上机时间和收费标准的关系,在预备时间中,是不收费的. 其次,在超过预备时间,一 ...
- luogu P2485 [SDOI2011]计算器
题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给定y.z.p,计算 ...
- Codeforces 804E The same permutation(构造)
[题目链接] http://codeforces.com/contest/804/problem/E [题目大意] 给出一个1到n的排列,问每两个位置都进行一次交换最终排列不变是否可能, 如果可能输出 ...
- NOI 二分算法练习
1.NOI 二分法求函数的零点 总时间限制: 1000ms 内存限制: 65536kB 描述 有函数: f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * ...
- 102.愤怒的LJF
2841 愤怒的LJF 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description LJF发现ZPC的积分比他高,他很愤 ...
- Codeforces Round #339 (Div. 1) B. Skills 暴力 二分
B. Skills 题目连接: http://www.codeforces.com/contest/613/problem/B Description Lesha plays the recently ...
- 最小生成树(Prime算法)
最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城 ...
- HMAC结合“挑战/响应”保障数据传输安全
1.流程图: HMAC的一个典型应用是结合“挑战/响应”(Challenge/Response)来保障客户端和服务器传输数据的安全性 . 2.安全性分析: 使用的密钥是双方事先约定的,第三方不可能知道 ...
- [Winform]线程间操作无效,从不是创建控件的线程访问它的几个解决方案,async和await?
目录 概述 取消跨线程检查 使用委托异步调用 sync和await 总结 概述 最近在qq群里有一朋友,问起在winform中怎么通过开启线程的方式去处理耗时的操作,比如,查看某个目录下所有的文件,或 ...