C++ 代码块和SFML库故障

C++ Codeblocks & SFML library failure

本文关键字:故障 SFML 代码 C++      更新时间:2023-10-16

我一直在尝试开始使用SFML库。然而,到目前为止,我的所有尝试都导致了许多错误。下面的代码和我想出的程序一样简单,但仍然给了我三个错误(下面列出的构建日志)

#include <SFML/System.hpp>
int main()
{
    sf::sleep(sf::seconds(1.f));
    return 0;
}

--------------内部版本:在SFML_TEST_14-3中发布(编译器:GNU GCC编译器)---------------

mingw32-g++.exe -LC:SFML-2.3.2lib -LC:SFML-2.3.2lib -LC:SFML-2.3.2lib -o binReleaseSFML_TEST_1.exe objReleasemain.o  -s  -lsfml-system-s -lsfml-system-s -lsfml-graphics-s -lsfml-window-s -lsfml-system-s -lsfml-graphics-s-d -lsfml-window-s-d -lsfml-system-s-d
C:SFML-2.3.2lib/libsfml-system-s.a(SleepImpl.cpp.obj):SleepImpl.cpp:(.text+0x21): undefined reference to `timeGetDevCaps@8'
C:SFML-2.3.2lib/libsfml-system-s.a(SleepImpl.cpp.obj):SleepImpl.cpp:(.text+0x2f): undefined reference to `timeBeginPeriod@4'
C:SFML-2.3.2lib/libsfml-system-s.a(SleepImpl.cpp.obj):SleepImpl.cpp:(.text+0x50): undefined reference to `timeEndPeriod@4'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
3 error(s), 0 warning(s) (0 minute(s), 0 second(s))

我正在为gcc 4.8.1使用代码::块13.12、MinGW 5.1.3和SFML 2.3.2。我试过使用这些旧版本,但什么都没有。

我很确定这些错误与库链接有关,但我不知道错误是从哪里产生的。我已经根据SFML开发人员的教程链接了所有内容;使用,而不更改全局编译器设置。

项目构建信息

我重建了&重新安装了好几次。使用静态和动态形式的SFML.a文件,并尝试使用TDM-GCC。我使用了一个复杂度最低的示例程序。有人能告诉我我做错了什么吗。链接器是找不到某个文件,还是我使用的代码在某种程度上无效?我可能丢失了一些我不知道的.dll吗?

窗口8.1

MinGW目录C:\MinGW

SFML目录C:\SFML2-3-2

他们不久前改变了SFML库的构建方式,因此您需要将它们与它们所依赖的其他库显式链接。这是为了解决人们使用自己版本的这些库的问题。

此处的文档:http://www.sfml-dev.org/tutorials/2.3/start-cb.php确实提供了您需要的信息,尽管可能没有那么明显。

我认为对于这个特定的错误,如果你也链接到-lwinmm,也许还有-lgdi32,它就能找到那个符号。

这是我链接的系统库的完整列表:

openal32
vorbisfile
vorbisenc
vorbis
ogg
FLAC
jpeg
freetype
ws2_32
gdi32
opengl32
winmm

如果您没有使用所有SFML功能,则不需要全部功能,例如,第一组功能仅由音频库使用,ws2_32仅用于网络。

请注意,您在其他事项中链接它们-库必须在它们所依赖的库之前列出。对于我的项目设置,我将上述系统库列表设置在项目构建选项的顶层。然后,对于不同的目标(调试、发布),我包括了SFML库。例如,对于调试版本:

sfml-graphics-s-d
sfml-window-s-d
sfml-network-s-d
sfml-system-s-d
sfml-main-d

对于发布版本,名称相同,但没有-d后缀。

然后,确保在链接器设置选项卡上,"策略"设置为将目标选项准备为项目选项,以便将它们插入到为顶级项目配置的库之前的命令行中。