【发布时间】:2014-07-04 20:39:42
【问题描述】:
我正在尝试从 Crysis Wars SDK 的源代码构建一个 DLL,并且过去曾在 Visual Studio 的早期版本(即 2005、2008 和 2010)上成功完成此操作。 我的具体问题是这样的:
Error 4 error LNK2019: unresolved external symbol "struct CTypeInfo const & __cdecl
TypeInfo<char>(char *)" (??$TypeInfo@D@@YAABUCTypeInfo@@PAD@Z) referenced in function
"void __cdecl SwapEndian<char>(char *,unsigned int)" (??$SwapEndian@D@@YAXPADI@Z)
G:\Noctis\Mods\Noctis\Code\GameCVars.obj GameDll
我已尝试在 Visual Studio 中清理代码并重新构建它,以防万一这会起作用,但这并没有改变任何东西。
我在这里遗漏了什么,或者从 C++03 到 C++11 有什么变化,这意味着如果不恢复到旧版本的 C++,这段代码就不再可编译?
我已经在 Visual Studio 2010 上成功编译了 64 位和 32 位的这段代码,所以它一定是与将项目迁移到 Visual Studio 2015 相关的一些问题。
在 2012、2013 和 2015 版本的 Visual Studio 上编译会重现此错误,但不会重现 2010,因此似乎在 C++11 中引入了触发此问题的更改。
我做错了什么?
阅读mem-fun is not a member of std 的答案,可能只是我需要包含一个我不需要包含在早期版本的 Visual Studio 中的标准库。
如果这是真的,我需要哪个库#include?
我也有created a GitHub repository containing only the original unmodified code provided from the SDK,用于测试目的(如果我自己打错了,这里似乎不是这种情况,但我把链接放在这里可能会有所帮助)。
如果重要的话,我在 Windows 10 Professional x64 上使用 Visual Studio 2015 企业版。
【问题讨论】:
-
请求重新打开问题。尽可能多地添加细节,并包含一个包含我正在处理的代码的 GitHub 存储库,因此可以重现问题。
-
您的证据表明问题是由 VS2012 引入的,而不是 C++11 本身。
-
@MM 证据表明是 C++11 导致它(作为 VS2010 和 VS2012 之间的主要变化),因为代码完美地编译为 C++03 而不是 C++11(可能虽然错了)。如果需要进一步确认,代码就在那里。
-
你可以尝试创建一个新的项目文件;升级旧项目文件有时会做一些奇怪的事情
-
TypeInfo<char>(char*)等在 CryCommon 项目 AutoTypeInfo.cpp 中定义。问题是 GameDll 编译得很好——它正确地找到了相关的 .h 文件,但是当它开始链接时,CryCommon 依赖项没有正确链接并导致错误。很难做出更多猜测,因为您的项目处于奇怪的状态(.sln 引用 .vcprojx,但仅签入 .vcproj 文件;有诸如#ifdef USE_<unordered_map>之类的损坏的东西...)确保已构建 CryCommon 项目并它被 GameDll 引用为依赖项(作为库添加)。
标签: c++ c++11 visual-studio-2015 c++03