c++ - 'TypeInfo<char>(char * )' isn' t defined but worked pre-C++11; what changed, and how can I fix the error?

标签 c++ c++11 visual-studio-2015 c++03

我正在尝试从 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/

相关文章:

c++ - NULL 函数指针,在头文件中声明的函数

c++ - 类 union 类中 `reinterpret_cast` 上的 `this` 是未定义的行为吗?

c++ - 这里循环携带的依赖在哪里?

c++ - 如何在 C++ 中使用默认模板参数显式实例化类?

operator-overloading - C++11 重载 `M operator+(M&&,M&&)`

c++ - 在 Windows 上测量 Opengl 的运行时间?

c++ - 在Android设备上获取COCOS2D-X中文件的完整路径

c++ - 是否有异常(exception)规则,如果地址可以使用&它是左值找到?

javascript - typescript 和React输出要求

c++ - std::string 类继承和繁琐的 C++ 重载解析