我正在尝试从 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++,这段代码就无法再编译?
我已经在 64 位和 32 位的 Visual Studio 2010 上成功编译了这段代码,所以它一定是与将项目迁移到 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 企业版。
最佳答案
错误是什么意思?
错误消息暗示了典型的“已声明但未定义”场景。
TypeInfo<char>(char*)
在 TypeInfo.h 中声明(通过一些宏)并在 AutoTypeInfo.cpp
中声明在 CryCommon 项目中。
通常您只需确保正确构建 CryCommon 项目并正确链接到您的最终 GameDll 项目即可。
但事实证明,CryCommon 项目已经很长时间没有构建了——它引用了许多其他 Crytek 库等。所以问题一定是现在需要这些 TypeInfo<>
定义,以前没有。
什么是引用 TypeInfo<>
代码?
在你的项目中它的功能是CmdHelp()
在 Aurora/Code/GameCVars.cpp 中,正是这一行:
nRead = gEnv->pCryPak->FRead( buf, BUFSZ, f );
执行FRead()
方法在 CryCommon/ICryPak.h 中:
template<class T>
size_t FRead(T *data, size_t elems, FILE *handle, bool bSwap = true)
{
size_t count = FReadRaw(data, sizeof(T), elems, handle);
if (bSwap)
SwapEndian(data, count);
return count;
}
如您所见,如果bSwap
为真(默认),SwapEndian()
在那里被调用。
为什么以前没有表现出来?
也许编译器的行为确实不同。
或者,更有可能的是,您之前一直将项目编译为 Release。整个字节交换功能仅在大端系统(您的目标很可能不是其中之一)或调试期间启用 - 然后字节实际上被交换两次以测试相关代码(参见 CryCommon/Endian.h) .
如何解决?
你现在有几个选择:
仅作为发布版本继续编译(可能和以前一样)。也许您永远不会在调试器中调试代码。
只需在
FRead()
中评论交换调用代码出来。无论如何,您正在使用它来加载文本文件,没有必要交换字符。...
FWIW,我必须做的其他事情才能使您的代码编译:
- 检查“损坏”之前的早期提交
- 加载 Mods\Aurora\Code\Aurora.sln
- 删除不存在的 .vcprojx 项目
- 再次添加所有 3 个 .vcproj 文件,让它们转换为 VS2015 的
- 对于 GameDll 项目,添加预处理器定义
_SILENCE_STDEXT_HASH_DEPRECATION_WARNING
- 对于 GameDll 项目,设置启用 C++ 异常处理
/EHsc
- 注释掉上面的代码
关于c++ - 'TypeInfo<char>(char * )' isn' t defined but worked pre-C++11; what changed, and how can I fix the error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24580523/