2014-11-01 3 views
0

Я пытаюсь добавить поддержку для Ogg Vorbis в моем проекте (C++, VS 2010). У меня не возникло проблем с компиляцией LibOgg + LibVorbis для создания статической библиотеки.Ошибка Ogg vorbis

Моя процедура заключается в следующем:

LibOgg

  • Скачать LibOgg
  • Построить LibOgg с динамическим решением (Release)
  • Получить libogg.lib экспорта и в libogg .dll в /выпуск папка

LibVorbis

  • Скачать LibVorbis
  • Установить соответствующий включают + библиотека папки для LibOgg
  • Построить LibVorbis с динамическим решением (Release)
  • Получить libvorbis .lib и libvorbisfile.lib экспорта и libvorbis.dll и libvorbisfile.dll в /Release папку

Моя программа

  • Установите соответствующий включают + библиотеки папки для Libogg + LibVorbis .lib exports
  • Место .dll в рабочей директории

сборка прошла успешно, но в отличие от статической сборки (который работает), динамическая сборка просто падает в первом ov_open вызова (который открывает некоторые .ogg файл). Я построил множество библиотек (GLEW, SQlite и т. Д.), но этот вариант дает мне орехи.

ответ

1

Ничего, я решаю это. кажется OggVorbis обидчив, когда дело доходит до Windows, и использование ov_open из-за некоторые проблемы увязывания с stdio.h и fopen.

Documentation говорит это ясно:

ПРЕДУПРЕЖДЕНИЕ для разработчиков Windows: Не используйте ov_open() в Windows, приложения; Windows связывает места с ограничениями при передаче FILE * успешно обрабатывает, а ov_open() запускает эти ограничения [a]. См. Страницу ov_open_callbacks() для получения более подробной информации об использовании ov_open_callbacks().

Хотя по документации рекомендуется использовать обратные вызовы, я нашел ov_fopen быть надежным, который работает как для статических и динамических сборок с OggVorbis; динамическая сборка приведет к сбою вашей программы, если вы используете ov_open на Windows.

Перейти к обновлению этого ответа после проверки его на Linux и OSX, чтобы проверить ov_fopen как безопасное решение.

UPDATE

Как уже говорилось, я проверил использование ov_fopenна Windows 7, Linux (Lubuntu), OSX (10.8.2) и Android (KitKat 4.4.4) и я узнал, что работает надежно. Итак, для тех, кто страдает аллергией на обратные вызовы (например, я), ov_fopen оказался надежно.

+0

Благодарим за информацию, но, похоже, я не могу найти значение по умолчанию OV_CALLBACKS_DEFAULT, которое, как говорят документы, передаются. Как мне обойти это? – rationalcoder

+0

@rationalcoder вы можете найти _default substitute_ для окон (как говорит xiph) на странице [this] (https://xiph.org/vorbis/doc/vorbisfile/ov_open_callbacks.html) (смотрите примечания ниже) и [ здесь] (https://xiph.org/vorbis/doc/vorbisfile/callbacks.html) есть некоторые способы. Если вы имеете в виду, что это _undeclared_, я тоже это видел .. никогда не нашел решения, так как im использовал 'ov_fopen' –

+0

Да, я обнаружил, что и я имел в виду необъявленное :(К сожалению для меня, так было ov_fopen !!! К счастью, однако, я наткнулся на старый поток gamedev.net, в котором была опубликована рабочая реализация обратных вызовов, которые используют stdio.h. Я запускаю и запускаю сейчас. +1 btw. – rationalcoder