TypeInfo & lt; char & gt; (char *) ‘не определен, но работал до C ++ 11; что изменилось, и как я могу исправить ошибку?

Я пытаюсь собрать 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.

9

Решение

Что означает ошибка?

Сообщение об ошибке указывает на классический «объявленный, но не определенный» сценарий.

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, другие вещи, которые я должен был сделать, чтобы ваш код компилировался:

  • Проверьте предыдущий коммит перед «Broken»
  • Загрузить моды \ Аврора \ Code \ Aurora.sln
  • Удалить несуществующие .vcprojx проекты
  • Снова добавьте все 3 файла .vcproj, чтобы они были преобразованы в файлы VS2015.
  • Для проекта GameDll добавьте определение препроцессора _SILENCE_STDEXT_HASH_DEPRECATION_WARNING
  • Для проекта GameDll установите включенную обработку исключений C ++ /EHsc
  • Закомментируйте код выше
4

Другие решения


По вопросам рекламы [email protected]