SFML:对 _imp_ 的未定义引用

SFML: undefined reference to _imp_

我正在尝试使用 SFML 创建 C++ 应用程序。按照教程,为 Windows 安装了 MinGW。我的项目在其根文件夹中有一个 main.cpp 文件,SFML 包含在 lib/sfml 中(相对于 main.cpp)。

我可以毫无问题地编译命令g++ -c main.cpp -g -o build/debug/game.o -Ilib/sfml/include

但是当我尝试 link 使用命令 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-graphics:

sfml-window-s.lib
sfml-system-s.lib
opengl32.lib
freetype.lib
jpeg.lib

唯一缺少的是opengl32.lib。如果我考虑 sfml-system 和 sfml-window,它也缺少 winmm.lib、gdi32.lib。我不知道这是否与错误有关,但欢迎任何帮助。

如果您link正在使用 SFML 的静态版本,SFML 的 header 文件必须知道这一点(因为函数签名略有变化)。因此,在包含任何 SFML header 之前,您必须在某处定义 SFML_STATIC,最好是作为项目、生成文件或构建系统的一部分。

此外,您必须确保 link 库的正确版本以及您实际想要使用的库。

以系统库为例:

  • sfml-system 是库的共享发布版本。
  • sfml-system-d 是库的共享 debug 构建。
  • sfml-system-s 是库的 s 静态发布版本。
  • sfml-system-s-d 是库的 static debug 构建。

如果您link使用 SFML 的静态版本,则只需 linkSFML 的依赖项(例如 OpenGL)。

SFML 从未随 OpenGL 一起提供,您可能将它与 OpenAL-soft 混淆了。无论哪种方式,您缺少的其他库文件要么由您的 toolchain/system(如 OpenGL 或 mmsystem)提供,要么可以在 SFML 的 extlibs/libs 文件夹中找到预编译的(取决于您是下载还是编译SFML 自己)。

已解决,我的错误。几天前我下载了用于 Visual C++ 编译器的 SFML 版本,但后来我放弃了 Visual Studio 2017,并决定将 Visual Studio 代码与 GCC 一起使用。所以我尝试使用我认为它是正确的 SFML。现在我已经下载了正确的版本并且运行良好。