Случайные нерешенные внешние символы, которые не должны быть там
Я использую для компиляции для 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) и перекомпилируйте все. Посмотрите, работает ли это сейчас.