SFML 未定义引用,即使定义了库

SFML undefined reference even with defining libs

我尝试使用 Makefile 将 SFML 库安装到 VS Code 项目。但是我遇到了一个问题。我有以下代码:

#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

图书馆:

那么,有人能告诉我我做错了什么吗?

您收到的错误可归因于您正在使用和用于编译您当前拥有的 SFML 库的编译器。跨编译器(甚至同一编译器的不同版本)的 C++ ABI 存在差异 [1]。当您想 link 将您的代码添加到一个库中时,您必须确保您使用的编译器和该库使用的编译器是相同的,或者是 ABI 兼容的。

使用vcpkg下载库时,这些库的来源是实际下载的库,而不是库本身。然后使用可以找到 [2] 的最新版本 Visual Studio 编译源代码。因此,如果您想使用通过 vcpkg 下载的库在 Windows 中,就像您的情况一样,您必须使用 Visual Studio,或者至少只使用编译器 MSVC。因此,解决您的问题的方法是使用 MSVC(由 [=42= 提供) ]), 而不是MinGW中的编译器,通常是GCC。

如果你还是想使用MinGW,有两个选择:

  1. 最简单的选择是使用与 MinGW 兼容的 SFML 包。 SFML 网站上有 MinGW 的官方预构建包。请注意,这些 MinGW 包仅与 GCC 7.3.0 兼容(在撰写本文时)。如果您使用不同的版本或不同的编译器,则必须求助于选项 2。

  2. 另一个选择是先自己编译SFML。完成编译后,您现在可以 link 使用您构建的 SFML 库编写代码。当您使用的编译器不是用于编译可用的预构建 SFML 库的编译器时,此选项也适用。

参考文献: