исправление сбоя режима выпуска libvlc с помощью VC2010 - PullRequest
2 голосов
/ 16 января 2012

Я использую libVLC в одном из моих приложений, которые я компилирую с VC2010 (также пробовал VC2008), режим отладки моего приложения работает отлично, но как только я компилирую в режим выпуска и пытаюсь вызвать libVLC, я получаю авария. Я просил помощи на форумах vlc, и кто-то упомянул, что это обычно указывает на различия в соглашениях, однако я не уверен, что нужно проверить, чтобы узнать, так ли это, или, что более важно, как это исправить.

некоторые заметки:

  • Я компилирую libVLC с использованием Ubuntu и следую инструкциям руководства по libVLC вики.
  • Я использую libVLC внутри файла C ++.
  • Я пытался скомпилировать libVLC с отладочной информацией и без нее.
  • Я пытался вызвать libvlc_get_version и libvlc_new в качестве первого вызова, оба сбоя.

Несмотря на то, что в моей версии выпуска у меня нет символов, я вижу стек вызовов, и он определенно запутывается, поскольку показывает функции в стеке, которые никогда не вызывались, что, кажется, указывает на неправильное соглашение о вызовах но опять же я не уверен, как это проверить / исправить.

Я не уверен, связано ли это, но другая проблема, с которой я сталкиваюсь с libvlc, заключается в том, что я пытаюсь отложить загрузку dll (пытался не делать этого для вышеуказанной проблемы, но это не имело значения), я ' добавив флаги компоновщика: /DELAYLOAD:libvlc.dll /DELAYLOAD:libvlccore.dll , но когда происходит связывание, я получаю следующие предупреждения:

LINK : warning LNK4199: /DELAYLOAD:libvlc.dll ignored; no imports found from libvlc.dll
LINK : warning LNK4199: /DELAYLOAD:libvlccore.dll ignored; no imports found from libvlccore.dll

Однако он определенно связан с lib и требует наличия dll, как это видно с Dependency Walker (не говоря уже о том, что я звоню в него) ... опять же, не уверен, связано ли это с этим, но тоже хотел выкинуть его туда.

Я ценю любой совет / помощь по этому вопросу. Спасибо!

Ответы [ 2 ]

3 голосов
/ 27 ноября 2012

Я только что столкнулся с той же проблемой, и после некоторого поиска с IDA disasembler я обнаружил, что компоновщик отбрасывает все импортные файлы libvlc.И да, флаги INCREMENTAL добавляют их обратно, но, как вы сказали, это не объяснение проблемы.

Теперь у меня было похожее событие при разработке драйвера, в котором Release исключал указатели и строки функций.И решением было установить для Linker \ Optimization \ References значение No (/ OPT: NOREF).Итак, компоновщик оставляет во всех ссылках, даже если он считает, что они не используются.

И, конечно, это решает проблему.

Итак, еще одна загадка решена.,)

С уважением, Вальдемар

0 голосов
/ 15 сентября 2015

На самом деле, добавление '/ OPT: NOREF' также решает проблему, по крайней мере, в моем случае. и я думаю, что проблема может быть результатом «проблемы» с dlltool, так как ffmpeg страдает той же проблемой (http://ffmpeg.org/platform.html#Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b), и, как и ffmpeg, libvlc (я предполагаю) может генерировать файлы Windows 'lib' с 'dlltool' вместо 'lib.exe' из msvc. связанный отчет об ошибке с dlltool находится здесь: https://sourceware.org/bugzilla/show_bug.cgi?id=12633#c1

поскольку вы утверждали, что "компилируете libVLC с использованием Ubuntu", я думаю, что вы, вероятно, столкнулись с той же проблемой. надеюсь, это поможет.

Кстати, в официальном дистрибутиве ffmpeg есть файлы .def, так что я могу восстановить «правильные» файлы lib с помощью «lib.exe» из msvc, и проблема решается. однако, поскольку официальный дистрибутив Windows для vlc не предоставляет файлы '.def', и мне не удалось восстановить файлы lib с помощью подхода 'dumpbin and lib' (не удалось, когда dumpbin, с dll должно быть что-то странное), я дальнейшая проверка невозможна.

...