我正在尝试从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,我必须做的其他事情才能使您的代码编译:
  • check out “Broken”之前的较早提交
  • 加载Mods\Aurora\Code\Aurora.sln
  • 删除不存在的.vcprojx项目
  • 再次添加所有3个.vcproj文件,让它们转换为VS2015格式的
  • 对于GameDll项目,添加预处理程序定义_SILENCE_STDEXT_HASH_DEPRECATION_WARNING
  • 对于GameDll项目,设置启用的C++异常处理/EHsc
  • 注释掉
  • 上面的代码

    关于c++ - 'TypeInfo <char>(char * )' isn' t已定义但在C++ 11之前有效;发生了什么变化,如何解决该错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24580523/

    10-09 19:53