【问题标题】:Can't play audio with STATIC linked SFML无法使用 STATIC 链接的 SFML 播放音频
【发布时间】:2020-03-09 21:27:39
【问题描述】:

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

 buf.loadFromFile("data\pong.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:\Users\Ahmad.T\source\repos\Project1\Project1\Source.cpp(69,19): warning C4129: 'p': unrecognized character escape sequence
1>C:\Users\Ahmad.T\source\repos\Project1\Project1\Source.cpp(133,19): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:\Users\Ahmad.T\source\repos\Project1\Project1\Source.cpp(137,20): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:\Users\Ahmad.T\source\repos\Project1\Project1\Source.cpp(141,20): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:\Users\Ahmad.T\source\repos\Project1\Project1\Source.cpp(151,19): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:\Users\Ahmad.T\source\repos\Project1\Project1\Source.cpp(155,20): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:\Users\Ahmad.T\source\repos\Project1\Project1\Source.cpp(159,20): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:\Users\Ahmad.T\source\repos\Project1\Project1\Source.cpp(164,21): warning C4244: 'argument': conversion from 'int' to 'float', possible loss of data
1>C:\Users\Ahmad.T\source\repos\Project1\Project1\Source.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:\Users\Ahmad.T\source\repos\Project1\x64\Debug\Project1.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

如果您需要进一步查看代码,如果需要,我会将其包含在评论中。

【问题讨论】:

  • flac.lib 是您自己构建的吗?似乎它是用不同的编译器使用一些标准函数的旧定义构建的..
  • 我所做的是从 SFML 网站下载资源文件并使用 C-make 制作解决方案以使用 Visual Studio 编译并写下所有依赖项,如图所示。

标签: c++ sfml


【解决方案1】:

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

这就是 SFML 为不同的 Visual Studio 版本提供下载的原因。

在 Microsoft 更改了头文件定义的版本之间,现在函数的定义与交付的库中的函数不同(基本上头文件在不同的 Visual Studio 版本之间发生了变化)。

你可能会成功

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

类似问题请见this answer

【讨论】:

  • 是的,好像我在 CMake 中编译库时做错了什么,重新编译它并且它工作。非常感谢您对我的支持!
猜你喜欢
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多