簡體   English   中英

“所屬類別 <char> (char *)&#39;未定義但在C ++ 11之前工作; 什么改變了,我該如何修復錯誤?

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

我正在嘗試從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的答案不是std的成員 ,它可能只是我需要包含一個標准庫,我不需要在早期版本的Visual Studio中包含它。 如果這是真的,我需要#include哪個庫?

我還創建了一個GitHub存儲庫,其中僅包含SDK提供原始未修改代碼 ,用於測試目的(如果我自己犯了一個錯字,這里似乎不是這種情況,但我把鏈接放在這里它可能會有所幫助)。

如果重要,我在Windows 10 Professional x64上使用Visual Studio 2015企業版。

錯誤是什么意思?

錯誤消息提示經典的“已聲明但未定義”的方案。

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之前。 整個字節交換功能僅在大端系統上啟用(並且您的目標很可能不是其中之一)或在調試期間 - 然后實際交換字節兩次以測試相關代碼(請參閱CryCommon / Endian.h) 。

可以做些什么來解決它?

你現在有幾個選擇:

  • 繼續編譯僅作為發布(可能與以前一樣)。 也許你永遠不會在調試器中調試代碼。

  • 只需在FRead()代碼中注釋交換調用FRead() 無論如何,您正在使用它來加載文本文件,交換字符周圍沒有任何意義。

  • ...


FWIW,我需要做的其他事情來編譯你的代碼:

  • 查看“Broken”之前的提交
  • 加載Mods \\ Aurora \\ Code \\ Aurora.sln
  • 刪除不存在的.vcprojx項目
  • 再次添加所有3個.vcproj文件,讓它們轉換為VS2015文件
  • 對於GameDll項目,添加預處理器定義_SILENCE_STDEXT_HASH_DEPRECATION_WARNING
  • 對於GameDll項目,設置啟用的C ++異常處理/EHsc
  • 注釋掉上面的代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM