我正在尝试从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有关,这一定是一些问题。
在Visual Studio 2012、2013和2015版本上进行的编译会重现此错误,但不会重现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 Enterprise版。
最佳答案
错误是什么意思?
该错误消息提示了经典的“已声明但未定义”方案。TypeInfo<char>(char*)
在TypeInfo.h中声明(通过一些宏),并在项目CryCommon中的AutoTypeInfo.cpp
中声明。
通常,您只需确保正确构建了CryCommon项目,并正确地将其链接到最终的GameDll项目即可。
但是事实证明,CryCommon项目没有建立很长时间-它引用了许多其他Crytek库等。因此问题必须是某些东西现在需要这些TypeInfo<>
定义,而以前则不需要。
什么是TypeInfo<>
代码的引用?
在您的项目中,它是Aurora/Code/GameCVars.cpp中的CmdHelp()
函数,正好是这一行:
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
为true(默认值),则会在此处调用SwapEndian()
。为什么以前没有表现出来?
也许编译器的行为确实有所不同。
或者,更有可能的是,您以前一直将项目编译为Release。整个字节交换功能仅在big-endian系统(目标很可能不是其中之一)或调试期间启用-然后字节实际上被交换了两次以测试相关代码(请参见CryCommon/Endian.h)。 。
该如何解决?
您现在有几种选择:
FRead()
代码中的交换调用即可。无论如何,您都在使用它来加载文本文件,而不必在周围交换字符。 FWIW,我必须做的其他事情才能使您的代码编译:
_SILENCE_STDEXT_HASH_DEPRECATION_WARNING
/EHsc
关于c++ - 'TypeInfo <char>(char * )' isn' t已定义但在C++ 11之前有效;发生了什么变化,如何解决该错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24580523/