无法使用静态链接的 SFML 播放音频



我正在制作一个简单的乒乓球游戏,在完成游戏后,我试图为球碰撞添加声音效果,但编译器无法编译代码并发送一些错误。我确保openal32已链接,.dll位于项目目录中。所以我会毫无问题地编写整个游戏,只要我包含

buf.loadFromFile("datapong.wav");
Sound sound;
sound.setBuffer(buf);

编译器甚至不会启动游戏,会给我这些错误,在为我正在使用的visual studio 2019编译SFML 2.5.1之后,我正在使用它。

1>------ Build started: Project: Project1, Configuration: Debug x64 ------
1>Source.cpp
1>C:UsersAhmad.TsourcereposProject1Project1Source.cpp(69,19): warning C4129: 'p': unrecognized character escape sequence
1>C:UsersAhmad.TsourcereposProject1Project1Source.cpp(133,19): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:UsersAhmad.TsourcereposProject1Project1Source.cpp(137,20): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:UsersAhmad.TsourcereposProject1Project1Source.cpp(141,20): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:UsersAhmad.TsourcereposProject1Project1Source.cpp(151,19): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:UsersAhmad.TsourcereposProject1Project1Source.cpp(155,20): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:UsersAhmad.TsourcereposProject1Project1Source.cpp(159,20): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:UsersAhmad.TsourcereposProject1Project1Source.cpp(164,21): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:UsersAhmad.TsourcereposProject1Project1Source.cpp(164,13): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>flac.lib(stream_decoder.obj) : error LNK2019: unresolved external symbol __iob_func referenced in function FLAC__stream_decoder_reset
1>flac.lib(stream_encoder.obj) : error LNK2001: unresolved external symbol __iob_func
1>flac.lib(win_utf8_io.obj) : error LNK2001: unresolved external symbol __iob_func
1>flac.lib(bitreader.obj) : error LNK2019: unresolved external symbol fprintf referenced in function FLAC__bitreader_dump
1>flac.lib(bitwriter.obj) : error LNK2001: unresolved external symbol fprintf
1>flac.lib(win_utf8_io.obj) : error LNK2019: unresolved external symbol vsnprintf_s referenced in function local_vsnprintf
1>MSVCRTD.lib(vsnprintf_s.obj) : error LNK2001: unresolved external symbol vsnprintf_s
1>MSVCRTD.lib(vsnprintf_s.obj) : error LNK2001: unresolved external symbol _vsnprintf_s
1>C:UsersAhmad.TsourcereposProject1x64DebugProject1.exe : fatal error LNK1120: 4 unresolved externals
1>Done building project "Project1.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

以下是链接到该项目的库:

flac.lib
opengl32.lib
openal32.lib
freetype.lib
winmm.lib
gdi32.lib
vorbisenc.lib
vorbisfile.lib
vorbis.lib
ogg.lib
ws2_32.lib
sfml-graphics-s-d.lib
sfml-window-s-d.lib
sfml-system-s-d.lib
sfml-audio-s-d.lib
sfml-network-s-d.lib

如果你需要进一步了解代码,如果需要,我会在评论中加入它。

我认为您使用了错误的编译器。由于SFML依赖于大量的底层库(flac.lib只是一个例子(。这些库是下载的一部分。然而,这些库需要与它们构建时的编译器一起使用。

这就是为什么SFML提供不同visual studio版本的下载。

在版本之间,Microsoft更改了头定义,因此现在函数的定义与交付的库不同(基本上是头文件在不同的Visual Studio版本之间更改(。

可能会让你成功

  • 使用legacy_stdio_definitions.lib来解决问题
  • 在当前编译器中重新编译所有依赖项(或搜索它们以下载(
  • 切换回支持的Visual Studio 2015

类似问题请参阅此答案

最新更新