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,有两个选择:
最简单的选择是使用与 MinGW 兼容的 SFML 包。 SFML 网站上有 MinGW 的官方预构建包。请注意,这些 MinGW 包仅与 GCC 7.3.0 兼容(在撰写本文时)。如果您使用不同的版本或不同的编译器,则必须求助于选项 2。
另一个选择是先自己编译SFML。完成编译后,您现在可以 link 使用您构建的 SFML 库编写代码。当您使用的编译器不是用于编译可用的预构建 SFML 库的编译器时,此选项也适用。
参考文献:
我尝试使用 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,有两个选择:
最简单的选择是使用与 MinGW 兼容的 SFML 包。 SFML 网站上有 MinGW 的官方预构建包。请注意,这些 MinGW 包仅与 GCC 7.3.0 兼容(在撰写本文时)。如果您使用不同的版本或不同的编译器,则必须求助于选项 2。
另一个选择是先自己编译SFML。完成编译后,您现在可以 link 使用您构建的 SFML 库编写代码。当您使用的编译器不是用于编译可用的预构建 SFML 库的编译器时,此选项也适用。
参考文献: