【问题标题】:Ogg vorbis crashOgg vorbis 崩溃
【发布时间】:2014-12-28 21:43:12
【问题描述】:

我正在尝试在我的项目 (C++, VS 2010) 中添加对 Ogg Vorbis 的支持。我在编译 LibOgg + LibVorbis 以生成静态库时没有问题。

我的程序是这样的:

LibOgg

  • 下载 LibOgg
  • 使用动态解决方案构建 LibOgg(发布)
  • /Release 文件夹中获取 libogg.lib 导出和 libogg.dll

LibVorbis

  • 下载 LibVorbis
  • LibOgg 设置适当的 include + library 文件夹
  • 使用动态解决方案构建 LibVorbis(发布)
  • 获取 libvorbis.liblibvorbisfile.lib 导出和 libvorbis.dlllibvorbisfile.dll /Release 文件夹

我的程序

  • Libogg + LibVorbis .lib 导出设置适当的 include + library 文件夹
  • .dll放在工作目录中

构建成功,但与静态构建(有效)不同,动态构建只是在第一个 ov_open 调用(打开一些 .ogg 文件)中崩溃。我构建了很多库(GLEW、SQlite 等),但这个库让我很疯狂。

【问题讨论】:

    标签: visual-studio-2010 oggvorbis


    【解决方案1】:

    没关系,我解决这个问题。 由于 stdio.hfopen 的一些链接问题,对于 Windowsov_open 的使用似乎 OggVorbis 很敏感.

    Documentation说的很清楚:

    Windows 开发者警告:不要在 Windows 中使用 ov_open() 应用程序; Windows 链接限制传递 FILE * 处理成功,并且 ov_open() 违反了这些限制 [一种]。有关使用的详细信息,请参阅 ov_open_callbacks() 页面 ov_open_callbacks() 代替。

    尽管文档建议使用回调,但我发现 ov_fopen 是可靠的,它适用于 OggVorbis 的静态和动态构建;如果您在Windows 上使用ov_open,动态构建将崩溃您的程序。

    在我针对 Linux 和 OSX 测试它以验证 ov_fopen 是一个安全的、全方位的解决方案之后,我会更新这个答案。

    更新

    如前所述,我在 Windows 7、Linux (Lubuntu)、OSX (10.8.2) 和 Android (KitKat 4.4.4) 上测试了 ov_fopen 的使用,我发现它有效可靠。所以,对于那些对回调过敏的人(比如我),ov_fopen 被证明是可靠的。

    【讨论】:

    • 感谢您的信息,但我似乎找不到文档说要通过的默认 OV_CALLBACKS_DEFAULT。我该如何解决这个问题?
    • @rationalcoder,您可以在this 页面(查看下面的注释)中找到 Windows 的 默认替代(如 xiph 所说),here 是一些方法到。如果您的意思是它是未声明的,我也看到过这个。自从我使用ov_fopen 以来从未找到解决方案
    • 是的,我发现了,我的意思是未声明 :( 不幸的是,ov_fopen 也是如此!!!幸运的是,我偶然发现了一个旧的 gamedev.net 线程,该线程发布了回调的工作实现使用 stdio.h。我现在正在运行。+1 顺便说一句。
    • @rationalcoder,这很奇怪,但很高兴你解决了这个问题。据我记得,ogg 一开始有点令人困惑,因为您实际上需要 两 (2) 个库,即 oggvorbis。 vorbis is 具有 ov_x 功能和大部分代码,而 ogg 本质上是 2 个源文件,产生一个小型库。也许你试过只编译 ogg 吗?我记得合并了两个库的源代码并生成了一个独立的 .lib 和 .a。
    • 不,我正在链接到这两个库,并包括文档所说的将在其中定义符号的标题。我手动搜索了标题,没有发现这样的东西! ov_fopen 应该在 vorbisfile.h 中,但它不是。
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 2011-05-19
    • 2013-12-14
    • 2011-02-08
    • 2011-12-04
    • 2013-03-01
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多