исправление сбоя режима выпуска libvlc с VC2010

Я использую 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

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

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


person mirswith    schedule 16.01.2012    source источник
comment
Я обнаружил, что добавление /INCREMENTAL к моим флагам компоновщика устраняет проблему, однако я не понимаю, почему, и пока я этого не сделаю, я не считаю это решением. :/   -  person mirswith    schedule 17.01.2012
comment
Вы можете использовать .libs из libvlc-sdk. библиотеки генерируются с помощью vc-libvlc, который основан на wiki.videolan.org/GenerateLibFromDll   -  person RSATom    schedule 15.09.2015


Ответы (2)


Я только что столкнулся с той же проблемой, и после некоторого изучения дизассемблера IDA я обнаружил, что компоновщик выбрасывает все импорты libvlc. И да, ДОПОЛНИТЕЛЬНЫЕ флаги добавляют их обратно, но, как вы сказали, это не объяснение проблемы.

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

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

Так разрешилась еще одна загадка. ,)

С уважением Вальдемар Полезно Бесполезно

person user1761654    schedule 26.11.2012

На самом деле, добавление '/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 и решить проблему. однако, поскольку официальный дистрибутив vlc для Windows не предоставляет файлы «.def», и мне не удалось восстановить файлы lib с помощью подхода «dumpbin and lib» (не удалось, когда dumpbin, должно быть что-то странное с dll), я не может сделать дополнительную проверку.

person uwydoc    schedule 15.09.2015