2

我正在使用 VC2010 编译的一个应用程序中使用 libVLC(也尝试过 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 并需要 dll,如 Dependency Walker 所见(更不用说我正在调用它).. 再次不确定这是否相关但也想把它扔在那里。

我很感激任何关于这个的建议/帮助。谢谢!

4

2 回答 2

3

我刚刚遇到了同样的问题,在使用 IDA 反汇编程序进行了一些挖掘之后,我发现链接器会抛出所有 libvlc 导入。是的,增量标志将它们重新添加,但正如你所说,这不是问题的解释。

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

当然,这可以解决问题。

于是另一个谜团解开了。,)

最好的问候沃尔德玛

于 2012-11-26T23:16:28.250 回答
-1

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

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

顺便说一句,ffmpeg 的官方发行版提供了“.def”文件,因此我可以使用 msvc 中的“lib.exe”重新生成“正确”的 lib 文件并解决问题。但是,由于vlc的官方windows发行版不提供'.def'文件,并且我无法通过'dumpbin and lib'方法重建lib文件(dumpbin时失败,dll一定有什么奇怪的地方),我无法进一步验证。

于 2015-09-15T09:11:52.167 回答