SFML: неопределенная ссылка на _imp_

Я пытаюсь создать приложение C++ с SFML. Пошёл учебник, установил MinGW для Windows. В моем проекте есть файл main.cpp в корневой папке, а SFML включен в lib/sfml (относительно main.cpp).

Я могу без проблем скомпилировать с командой g++ -c main.cpp -g -o build/debug/game.o -Ilib/sfml/include

Но я получаю неопределенные ссылки, когда пытаюсь связать команду g++ build/debug/game.o -o build/debug/game.exe -Llib/sfml/lib -lsfml-graphics-d -lsfml-window-d -lsfml-system-d

Некоторые из ошибок:

C:\Users\andre\Documents\Repos\Game/main.cpp:5: undefined reference to `_imp___ZN2sf6StringC1EPKcRKSt6locale'
C:\Users\andre\Documents\Repos\Game/main.cpp:5: undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj'
C:\Users\andre\Documents\Repos\Game/main.cpp:5: undefined reference to `_imp___ZN2sf12RenderWindowC1ENS_9VideoModeERKNS_6StringEjRKNS_15ContextSettingsE'

Я уже искал, и, кажется, ничего не помогает мне. Что мне показалось странным, так это то, что в некоторых предыдущих версиях SFML он содержал больше библиотек в папке lib, например opengl32.lib. Тем не менее, он говорит, что, например, sfml-графика мне нужна:

sfml-window-s.lib
sfml-system-s.lib
opengl32.lib
freetype.lib
jpeg.lib

Отсутствует только один файл opengl32.lib. Если я рассматриваю sfml-систему и sfml-окно, то в ней тоже нет winmm.lib, gdi32.lib. Я не знаю, связано ли это с ошибками, но любая помощь приветствуется.

2 ответа

Решение

Решена моя ошибка. Несколько дней назад я скачал SFML-версию для компилятора Visual C++, но потом отказался от Visual Studio 2017 и решил использовать Visual Studio Code с GCC. Поэтому я попытался использовать SFML, который, как мне показалось, был правильным. Сейчас я скачал правильную версию, и она работает отлично.

Если вы связываете статическую версию SFML, заголовочные файлы SFML должны знать об этом (поскольку сигнатура функции изменяется незначительно). Как таковой вам придется определить SFML_STATIC где-то до того, как вы включите любой заголовок SFML, в идеале, как часть вашего проекта, создания файлов или сборки системы.

Кроме того, вам нужно обязательно связать правильные версии библиотек и те, которые вы на самом деле хотите использовать.

В качестве примера для системной библиотеки:

  • sfml-system является общей версией библиотеки.
  • sfml-system-d это общая сборка библиотеки ebug.
  • sfml-system-s это сборка релиза библиотеки.
  • sfml-system-s-d это статическая сборка библиотеки.

Вам нужно будет только связать зависимости SFML (например, OpenGL), если вы связываете статическую версию SFML.

SFML никогда не поставлялся с OpenGL, вы, вероятно, путаете его с OpenAL-soft. В любом случае, дополнительные файлы библиотеки, которые вы пропустили, либо предоставляются вашей цепочкой инструментов / системой (например, OpenGL или mmsystem), либо могут быть найдены предварительно скомпилированными в папке extlibs / libs SFML (в зависимости от того, загружали вы или компилировали SFML самостоятельно).

Другие вопросы по тегам