SFML:对_imp_的未定义引用

时间:2018-02-07 10:38:32

标签: c++ gcc linker g++ sfml

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

我可以使用命令g++ -c main.cpp -g -o build/debug/game.o -Ilib/sfml/include

进行编译而不会出现问题

但是当我尝试链接命令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文件夹中有更多的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。我不知道这是否与错误有关,但欢迎任何帮助。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果您要链接SFML的静态版本,SFML的头文件必须知道这一点(因为函数签名稍有变化)。因此,在包含任何SFML标头之前,您必须在某处定义SFML_STATIC,理想情况是作为项目的一部分,制作文件或构建系统。

此外,您必须确保链接正确版本的库和您实际想要使用的版本。

作为系统库的示例:

  • sfml-system是该库的共享发布版本。
  • sfml-system-d是该库的共享 d ebug版本。
  • sfml-system-s是图书馆的 s tatic版本。
  • sfml-system-s-d是图书馆的 s tatic d ebug版本。

如果您要链接SFML的静态版本,则只需链接SFML的依赖项(例如OpenGL)。

SFML从未附带OpenGL,你可能会将它与OpenAL-soft混淆。无论哪种方式,您缺少的其他库文件都是由您的工具链/系统(如OpenGL或mmsystem)提供的,或者可以在SFML的extlibs / libs文件夹中预编译(取决于您是自己下载或编译过SFML)。