SFML неопределенная ссылка даже с определением библиотек - PullRequest
0 голосов
/ 18 апреля 2020

Я попытался установить библиотеку SFML в проект VS Code, используя Makefile. Но я столкнулся с проблемой. У меня есть следующий код:

#include <SFML/Graphics.hpp>
#include <string>

int main()
{
    // Creating the main window
    sf::RenderWindow window(sf::VideoMode(800, 600), "Asteroids");

    return EXIT_SUCCESS;
}

И у меня есть следующий Makefile:

CXX       := g++
CXX_FLAGS := -Wall -Wextra -std=c++17 -ggdb

BIN     := bin
SRC     := src
INCLUDE := include
LIB     := lib

LIBRARIES   := -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-main

EXECUTABLE  := main

SFML_LIBRARY := "C:\\vcpkg\\installed\\x64-windows\\include"
SFML_LIB := "C:\\vcpkg\\installed\\x64-windows\\lib"

all: $(BIN)/$(EXECUTABLE)

run: clean all
    cls
    ./$(BIN)/$(EXECUTABLE)

$(BIN)/$(EXECUTABLE): $(SRC)/*.cpp
    $(CXX) $(CXX_FLAGS) -I$(INCLUDE) -L$(LIB) -I$(SFML_LIBRARY) -L$(SFML_LIB) $^ -o $@ $(LIBRARIES)

clean:
    -del $(BIN)\* /Q

Но когда я пытаюсь скомпилировать код, я получаю следующее сообщение об ошибке:

g++ -Wall -Wextra -std=c++17 -ggdb -Iinclude -Llib -I"C:\\vcpkg\\installed\\x64-windows\\include" -L"C:\\vcpkg\\installed\\x64-windows\\lib" src/main.cpp -o bin/main -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio -lsfml-main
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\totalboy\AppData\Local\Temp\cclPlFnI.o:D:\C++ Projects\Asteroids/src/main.cpp:7: undefined reference to `__imp__ZN2sf6StringC1EPKcRKSt6locale'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\totalboy\AppData\Local\Temp\cclPlFnI.o: in function `main':
D:\C++ Projects\Asteroids/src/main.cpp:7: undefined reference to `__imp__ZN2sf9VideoModeC1Ejjj'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:\C++ Projects\Asteroids/src/main.cpp:7: undefined reference to `__imp__ZN2sf12RenderWindowC1ENS_9VideoModeERKNS_6StringEjRKNS_15ContextSettingsE'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:\C++ Projects\Asteroids/src/main.cpp:7: undefined reference to `__imp__ZN2sf12RenderWindowD1Ev'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:23: bin/main] Error 1

Libs:

Итак, кто-то может сказать мне, что я делаю неправильно?

1 Ответ

0 голосов
/ 18 апреля 2020

Полученные вами ошибки могут быть отнесены к компиляторам, которые вы используете и используете для компиляции библиотек SFML, которые у вас есть в настоящее время. В C ++ ABI есть различия между компиляторами (и даже между версиями одного и того же компилятора) [1] . Если вы хотите связать свой код с библиотекой, вы должны убедиться, что используемый вами компилятор и используемый с библиотекой одинаковы или совместимы с ABI.

При использовании vcpkg для скачать библиотеки, источником этих библиотек являются те, которые фактически загружаются, а не сама библиотека. Затем исходный код компилируется «с использованием самой последней версии Visual Studio, которую он может найти [2] ». Таким образом, если вы хотите использовать библиотеки, загруженные через vcpkg в Windows, как в вашем случае Вы должны использовать Visual Studio или, по крайней мере, только компилятор MSV C. Таким образом, решение вашей проблемы - использовать MSV C (предоставленный Visual Studio) вместо компилятора в MinGW, который обычно это G CC.

Если вы все еще хотите использовать MinGW, есть два варианта:

  1. Самый простой вариант - использовать MinML-совместимые SFML-пакеты. На веб-сайте SFML есть официальные готовые пакеты для MinGW. Обратите внимание, что эти пакеты MinGW совместимы только с G CC 7.3.0 (на момент написания). Если вы используете другую версию или другой компилятор, вам нужно прибегнуть к варианту 2.

  2. Другой вариант - сначала скомпилировать SFML самостоятельно. После завершения компиляции вы можете связать свой код с библиотеками SFML, которые вы создали. , Эта опция также применима, когда вы используете компиляторы, отличные от тех, которые используются для компиляции доступных готовых библиотек SFML.

Ссылки:

...