最近在研究雷神的开源项目VideoEye,但是下载编译时用VS2013和VS2015都出现一些报错。分析是因为雷神调试的环境是VS2010,现在使用新版本VS编译时存在不兼容的问题。网上查找各种信息,最终问题得以解决,于是乎记录一下。

【背景】

项目地址 http://git.oschina.net/leixiaohua1020/VideoEye

【解决方案】

一、VS2013和VS2015均需要修改

修改方案:

1、stdafx.h

在18行添加如下代码

#include <cmath>
#include <xtgmath.h>

using namespace std;

2、ve_play.cpp

在92行:rint(double x)改为rint_1(double x)

在1763行:在两个PRId64前面分别加空格

二、VS2015

1、无法解析的外部符号

LNK2019	无法解析的外部符号 _sscanf_s

修改方案:

项目-》属性-》链接器-》输入-》附加依赖项,添加:

legacy_stdio_definitions.lib

1.jpg

2.jpg

经过上述修改后,编译通过。

三、VS2013

出现类似下面的错误

LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
uafxcw.lib(afxmem.obj)

修改方案:

项目-》属性-》链接器-》输入-》忽略特定默认库,添加:uafxcw.lib;LIBCMT.lib

项目-》属性-》链接器-》输入-》附加依赖项,添加:uafxcw.lib;LIBCMT.lib

之前在电脑上乱七八糟做了各种尝试,应该是按照上面设置就可以了。

不确定有没有忽略的,后面遇到再补充吧。

四、补充VS2015编译其他项目时的问题

1、错误如下:

LNK2019 无法解析的外部符号 __imp__fprintf,该符号在函数 _ShowError 中被引用
LNK2019 无法解析的外部符号 __imp____iob_func,该符号在函数 _ShowError 中被引用

修改方案:

(1)参考二中添加legacy_stdio_definitions.lib

(2)添加如下代码

extern "C"
{
	FILE __iob_func[3] = { *stdin,*stdout,*stderr };
}

2、错误如下

LNK2019	无法解析的外部符号 _Direct3DCreate9@4

解决方案:

(1)参考二的方式添加d3d9.lib