2012-01-16 127 views
2

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

一些注意事项:

  • 我使用Ubuntu和下面的如何引导上libVLC维基libVLC编译。
  • 我在C++文件中使用libVLC。
  • 我试过在没有调试信息的情况下编译libVLC。
  • 我已经尝试调用libvlc_get_version和libvlc_new作为我的第一个调用,都崩溃。

即使我没有在我的发行版本的符号,我可以看到调用堆栈,它肯定是越来越乱了,因为它是显示那些从来有史以来叫这似乎表明堆栈功能错误的调用约定,但我不知道如何检查/修复此问题。

我不确定它是否是相关的,但我与libvlc有一个问题是我试图延迟加载dll(试过没有为上述问题做这件事,但它没有改变),我“M添加链接标志:/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中看到的(更不用提我调用它)..再次不确定这是否有关,但也想把它扔出去。

我很感激任何意见/在这一个帮助。谢谢!

+0

我发现添加/ INCREMENTAL到我的链接器标志修复了问题,但我不明白为什么,直到我做我不认为这是一个解决方案。 :/ – mirswith 2012-01-16 21:39:35

+0

您可以使用[libvlc-sdk]中的.libs(https://github.com/RSATom/libvlc-sdk)。 libs会使用[vc-libvlc](https://github.com/RSATom/vc-libvlc)生成,它基于https://wiki.videolan.org/GenerateLibFromDll/ – RSATom 2015-09-15 11:57:15

回答

3

我刚刚遇到了同样的问题,经过与IDA dissasembler的一些挖掘后,我发现链接器会抛出所有libvlc导入。并且是INCREMENTAL标志将它们添加回来,但正如你所说的那样,它不是对问题的解释。

现在我在设计一个驱动程序的时候发生了类似的情况,其中Release释放了函数指针和字符串。解决方案是将链接器\优化\参考设置为否(/ OPT:NOREF)。所以,即使链接器认为它们没有被使用,链接器也会留在所有引用中。

当然,这可以解决问题。

解决了另一个谜题。 )

问候 瓦尔德马

-1

实际上,加入 '/ OPT:NOREF' 解决问题为好,至少在我的情况。我认为这个问题可能是由dlltool的'问题'造成的,因为ffmpeg存在同样的问题(http://ffmpeg.org/platform.html#Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b),并且像ffmpeg,libvlc(我猜)可能会用'dlltool'而不是'lib'生成windows'lib'文件。 exe'从msvc。与DLL工具相关的错误报告在这里: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),我无法进一步验证。