光看这个可解决不了,你得找到具体是哪个外部符号无法解析。通常的原因是只声明了类型、方法,但是没有实现,或者实现部分没有被编译或链接。
但是用VS2013就能正常编译
@dudu: 在 VS 2015 中,将每个项目的“平台工具集”都修改为 Visual Studio 2013(v120),然后编译试试。
@Launcher: VS项目是由cmake生成的:
cmake -G "Visual Studio 14 2015 Win64"
如果指定为v120:
cmake -G "Visual Studio 14 2015 Win64" -G "v120"
会出现下面的错误:
-- The C compiler identification is unknown -- The CXX compiler identification is unknown
@dudu: 人家不是说了Bringing VS 2015 support is of the top items on our list. Stayed tuned.
@羽商宫: 我想自己先尝试一下
@dudu: 你用 VS 2013 编译后是不是会得到一个 CoreCRL.sln ?
@Launcher: 有这个,是cmake生成的,用VS2015可以打开。在VS2015中直接编译时出现的第一个错误是:
Error C3688 invalid literal suffix 'L'; literal operator or literal operator template 'operator ""L' not found cee_wks d:\dev\dotnet\coreclr-build-with-2015\coreclr\src\vm\dwreport.cpp 98
@Launcher: 而用VS2013打开CoreCLR.sln可以正常编译
@dudu: 用 VS 2015 打开此 SLN,将每个项目的“平台工具集”都修改为 Visual Studio 2013(v120),编译试试。
@dudu: 帮我看看 98 是哪行代码?我看这个 L 符号特别像 UNICODE 字符串声明。
@Launcher: 98行代码:
const WCHAR kWatsonPath[] = WATSON_INSTALLED_REG_SUBPATH;
WATSON_INSTALLED_REG_SUBPATH的定义中用到了L:
#define QUEUE_REG_SUBPATH L"Software\\"DEFAULT_SUBPATH #define QUEUE_REG_OKTOREPORT_VALUE L"OkToReportFromTheseQueues" #define WATSON_INSTALLED_REG_SUBPATH QUEUE_REG_SUBPATH L"\\Installed"
@Launcher:
将
#define QUEUE_REG_SUBPATH L"Software\\"DEFAULT_SUBPATH
改为(加了一个空格):
#define QUEUE_REG_SUBPATH L"Software\\" DEFAULT_SUBPATH
该错误消失。
这是VS2015的C++编译器的变化带来的问题,详见:L"" with ## fails in macro in vs2015 C++ preview
你试试新建一个 C++ 项目,能否重现这个问题。
二,你看 dwreport.cpp 文件开头
const WCHAR kErrorReportingPoliciesKey[] = W("SOFTWARE\\Policies\\Microsoft\\PCHealth\\ErrorReporting");
const WCHAR kErrorReportingKey[] = W("SOFTWARE\\Microsoft\\PCHealth\\ErrorReporting");
看下宏 W 的定义是啥?
@Launcher: 那台安装VS2015的机器上没有安装VS2013,“平台工具集”中根本没有v120的选项,而且有59个项目。
@dudu: 没有就不行了,除去语法变动问题,其它编译器兼容性比较好解决。
https://msdn.microsoft.com/en-us/library/f6xx1b1z.aspx
看过这个么