[英]'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,我需要做的其他事情來編譯你的代碼:
_SILENCE_STDEXT_HASH_DEPRECATION_WARNING
/EHsc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.