我一直在努力开始使用SFML库。然而,到目前为止我的所有尝试都导致了许多错误。下面的代码与我提出的程序一样简单,但仍然给我三个错误(下面列出的构建日志)
#include <SFML/System.hpp>
int main()
{
sf::sleep(sf::seconds(1.f));
return 0;
}
-------------- Build:在SFML_TEST_14-3中发布(编译器:GNU GCC编译器)---------------
mingw32-g++.exe -LC:\SFML-2.3.2\lib -LC:\SFML-2.3.2\lib -LC:\SFML-2.3.2\lib -o bin\Release\SFML_TEST_1.exe obj\Release\main.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.2\lib/libsfml-system-s.a(SleepImpl.cpp.obj):SleepImpl.cpp:(.text+0x21): undefined reference to `timeGetDevCaps@8'
C:\SFML-2.3.2\lib/libsfml-system-s.a(SleepImpl.cpp.obj):SleepImpl.cpp:(.text+0x2f): undefined reference to `timeBeginPeriod@4'
C:\SFML-2.3.2\lib/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))
我正在使用Code :: Blocks 13.12,MinGW 5.1.3和SFML 2.3.2 for gcc 4.8.1工作(或者更确切地说不工作)。我尝试过使用旧版本的这些但没有。
我相当肯定这些错误与图书馆链接有关,但我不知道错误发生在哪里。我根据SFML-dev的教程链接了所有内容;无需更改全局编译器设置。
我重建了&amp;重新安装了几次。使用SFML .a文件的静态和动态形式,并尝试使用TDM GCC。我使用了一个我能管理的复杂性最低的示例程序。任何人都可以告诉我我做错了什么。链接器是否找不到某个文件,或者我使用的代码是否以某种方式无效?我可能会错过一些我不知道的.dll吗?
Window 8.1
MinGW目录C:\ MinGW
SFML目录C:\ SFML2-3-2
答案 0 :(得分:1)
他们改变了前一段时间构建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仅用于网络。
请注意,另一个是您在事务中链接它们 - 库必须在它们所依赖的库之前列出。对于我的项目设置,我在项目构建选项的顶层设置了上面的系统库列表。然后,对于不同的目标(Debug,Release),我包含了SFML库。例如对于调试版本:
sfml-graphics-s-d
sfml-window-s-d
sfml-network-s-d
sfml-system-s-d
sfml-main-d
对于发行版本,名称相同但没有-d后缀。
然后,确保在链接器设置选项卡上将“策略”设置为将目标选项预先添加到项目选项,以便在为顶层配置的库之前插入命令行项目