使用VC2010修复libvlc发布模式崩溃

时间:2012-01-16 19:29:57

标签: crash calling-convention libvlc release-mode

我在我的一个应用程序中使用libVLC,我正在使用VC2010编译(也尝试过VC2008),我的应用程序的调试模式工作得很好但是一旦我编译到发布模式并尝试调用libVLC我得到一个崩溃。我在vlc论坛上寻求帮助,有人提到这通常指向调用约定差异,但是我不确定要检查是否是这种情况,或者更重要的是如何修复它。

一些注意事项:

  • 我正在使用Ubuntu编译libVLC,并按照如何在libVLC wiki上进行指南。
  • 我在C ++文件中使用libVLC。
  • 我尝试使用和不使用调试信息来编译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并且需要与Dependency Walker一起看到的dll(更不用说我正在调用它)..再次不确定这是否相关但是也想把它扔出去。 / p>

我感谢您对此提出的任何建议/帮助。谢谢!

2 个答案:

答案 0 :(得分:3)

我刚刚遇到同样的问题,在与IDA dissasembler进行了一些挖掘之后,我发现链接器会抛出所有libvlc导入。是的INCREMENTAL标志将它们重新添加,但正如您所说,这不是对问题的解释。

现在我在设计一个驱动程序时发生了类似的事情,其中​​Release消除了函数指针和字符串。解决方案是将Linker \ Optimization \ References设置为No(/ OPT:NOREF)。因此,即使链接器认为它们未被使用,链接器也会在所有引用中离开。

当然,这解决了这个问题。

另一个谜团解决了。 ,)

祝你好运 瓦尔德马

答案 1 :(得分:-1)

实际上,添加'/ OPT:NOREF'也解决了这个问题,至少在我的情况下如此。我认为问题可能是由于dlltool的“问题”,因为ffmpeg遇到同样的问题(http://ffmpeg.org/platform.html#Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b),而且像ffmpeg一样,libvlc(我猜)可能用'dlltool'生成windows'lib'文件来自msvc的'lib.exe'。与dlltool相关的错误报告在这里:https://sourceware.org/bugzilla/show_bug.cgi?id=12633#c1

正如您声称您“使用Ubuntu编译libVLC”,我想您可能遇到了同样的问题。希望它会有所帮助。

顺便说一下,ffmpeg的官方发行版提供了'.def'文件,所以我可以用msvc中的'lib.exe'重新生成'正确'的lib文件并解决问题。但是,因为vlc的官方Windows发行版不提供'.def'文件,并且我无法通过'dumpbin和lib'方法重建lib文件(当dumpbin失败时,dll一定有些奇怪的东西),我无法进一步验证。