Случайные нерешенные внешние символы, которые не должны быть там

Я использую для компиляции для Linux, поэтому этот материал .lib для меня немного странный. С моей программой в Visual Studio я продолжаю получать случайный неразрешенный внешний символ для других библиотек и даже Microsoft Runtimes.

1>glfw3.lib(init.c.obj) : error LNK2019: unresolved external symbol __imp__vsnprintf referenced in function __glfwInputError
1>MSVCRTD.lib(vsnprintf.obj) : error LNK2001: unresolved external symbol __imp__vsnprintf
1>glfw3.lib(context.c.obj) : error LNK2019: unresolved external symbol __imp__sscanf referenced in function _parseVersionString
1>MSVCRTD.lib(vsnprintf.obj) : error LNK2001: unresolved external symbol __imp___vsnprintf
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\OLDNAMES.lib : warning LNK4272: library machine type 'UNKNOWN' conflicts with target machine type 'X86'

Я включаю только эти библиотеки, и могу подтвердить, что они находятся:

x86/glew32s.lib
x86/glfw3.lib
x86/glfw3dll.lib
opengl32.lib

С их унаследованными значениями:

kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib

Я могу подтвердить, что это точный порядок. Я попытался установить и переустановить Windows 7 SDK и Visual Studio - я тоже на Windows 7.

Любая помощь по этому вопросу будет оценена, и я с удовольствием предоставит вам дополнительную информацию, если потребуется.

Спасибо, Boncey

Ответ 1

Проблема в том, что ваши статические libs glfw были созданы с другой версией Visual Studio, чем тот, который вы используете. Начиная с spring 2015, предварительно созданные на glfw.org не совместимы с Visual Studio 2015 RC (которые вы, кажется, используете).

К счастью, GLFW представляет собой небольшую базу кода, выпущенную под разрешительной лицензией, поэтому самым простым решением является создание для него нового проекта в вашем решении. Шаги будут выглядеть примерно так:

  • Создайте новый пустой проект GLFW в вашем решении.
  • Скопируйте в include, deps/GL и создайте папку src.
  • Скопируйте все исходные файлы в папку src для платформ, которые вы собираетесь поддерживать. Для окон это все с префиксом win или wgl или без префикса. Вы можете игнорировать весь материал cmake.
  • Создайте файл в src под названием glfw_config.h, содержащий #defines из _GLFW_WIN32, _GLFW_WGL и _GLFW_USE_OPENGL. Если вы хотите поддерживать больше, чем просто окна, вам придется условно определить параметры, которые вы хотите в этом файле. Все варианты описаны в src/glfw_config.h.in.
  • Добавьте все соответствующие файлы в проект Visual Studio.
  • В параметрах проекта установите для параметра Конфигурация типа значение static lib. В разделе C/С++ > Общие, убедитесь, что SDL Checks отключен. И в Preprocessor добавьте _GLFW_USE_CONFIG_H к определениям.
  • Установите основной проект в зависимости от проекта GLFW (в меню правой кнопки мыши). Наконец, добавьте правильную библиотеку GLFW в зависимости от компоновщика. (У меня есть выходной каталог для GLFW, поэтому правильная lib - это просто $(SolutionDir)GLFW\$(Platform)\$(Configuration)\glfw.lib.)

Ответ 2

Вы также можете добавить дополнительную библиотеку к вводу компоновщика i.e, legacy_stdio_definitions.lib

Перейдите в меню "Свойства" > "Компоновщик" > "Enter".

И в дополнительных зависимостях добавьте вышеупомянутую библиотеку.

Ответ 3

Похоже, что существует некорректное соединение между динамической и статической библиотекой времени исполнения. Префикс "__imp" на символах означает, что ваш код ищет что-то из DLL, но библиотеки, на которые вы ссылаетесь, вероятно, ожидают статические библиотеки времени выполнения.

Поднимите страницы свойств проекта (в разделе Build- > Properties) и найдите категорию С++ слева. В разделе "Генерация кода" должна быть запись "Библиотека времени выполнения". Вероятно, в настоящее время это настроено на многопоточную Debug DLL (/MDd), поскольку похоже, что вы компилируете в режиме отладки. Измените это на Multi-threaded Debug (/MTd) и перекомпилируйте все. Посмотрите, работает ли это сейчас.