Я пытаюсь собрать DLL из исходного кода из Crysis Wars SDK, и в прошлом успешно делал это на предыдущих версиях 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 ++?
Я успешно скомпилировал этот код в Visual Studio 2010 как в 64-разрядной, так и в 32-разрядной версиях, поэтому это должно быть связано с миграцией проекта в Visual Studio 2015.
Компиляция в версиях Visual Studio 2012, 2013 и 2015 гг. Воспроизводит эту ошибку, но не 2010, поэтому кажется, что изменение, вызывающее эту проблему, было введено в C ++ 11.
Что я делаю неправильно?
Чтение ответа на mem-fun не является членом std, возможно, мне нужно включить стандартную библиотеку, которую мне не нужно было включать в более ранние версии Visual Studio.
Если это правда, какую библиотеку мне нужно #include
?
У меня также создал репозиторий GitHub, содержащий только оригинальный неизмененный код, предоставленный из SDK, для целей тестирования (в случае, если я сам сделал опечатку, что, похоже, здесь не так, но я поместил здесь ссылку, так как это может быть полезно).
Если это имеет значение, я использую Visual Studio 2015 Enterprise Edition в Windows 10 Professional x64.
Сообщение об ошибке указывает на классический «объявленный, но не определенный» сценарий.
TypeInfo<char>(char*)
объявлен в TypeInfo.h (через некоторые макросы) и объявлен в AutoTypeInfo.cpp
в проекте CryCommon.
Обычно вы просто убедитесь, что проект CryCommon правильно построен и правильно связан с вашим окончательным проектом GameDll, и все.
Но здесь выясняется, что проект CryCommon долгое время не создавался — он ссылается на многие другие библиотеки Crytek и т. Д. Таким образом, проблема заключается в том, что теперь что-то нужно TypeInfo<>
определений и ранее не было.
TypeInfo<>
код?В вашем проекте это функция CmdHelp()
в Авроре / 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()
вызывается там.
Возможно, компилятор действительно вел себя по-другому.
Или, более вероятно, вы всегда компилировали проект как Релиз до. Вся функция перестановки байтов включена только в системах с прямым порядком байтов (и ваша цель, скорее всего, не одна из них) или во время отладки — тогда байты фактически меняются местами дважды для тестирования соответствующего кода (см. CryCommon / Endian.h) ,
У вас есть несколько вариантов сейчас:
Продолжайте компилировать только как релиз (вероятно, как и раньше). Возможно, вы все равно никогда не будете отлаживать код в отладчике.
Просто прокомментируйте вызов своп в FRead()
закодировать Вы используете его для загрузки текстового файла в любом случае, нет смысла менять символы вокруг.
…
FWIW, другие вещи, которые я должен был сделать, чтобы ваш код компилировался:
_SILENCE_STDEXT_HASH_DEPRECATION_WARNING
/EHsc