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

问题描述 投票:0回答:1

我尝试使用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

库:

“”

所以,有人可以告诉我我做错了吗?

c++ makefile sfml
1个回答
0
投票

您收到的错误可以归因于您正在使用的编译器,并且可以用于编译当前拥有的SFML库。跨编译器(甚至跨同一编译器的版本)的C ++ ABI存在差异[1]。当您要将代码链接到库时,必须确保使用的编译器和与该库一起使用的编译器相同或兼容ABI。

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

如果您仍然想使用MinGW,则有两种选择:

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

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

参考:

© www.soinside.com 2019 - 2024. All rights reserved.