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 самостоятельно).