2

VC2010 でコンパイルしているアプリの 1 つで libVLC を使用しています (VC2008 も試しました)。アプリのデバッグ モードはうまく機能しますが、リリース モードにコンパイルして libVLC を呼び出そうとするとすぐにクラッシュします。私は vlc フォーラムで助けを求めましたが、これは通常、呼び出し規約の違いを指していると誰かが言いましたが、これが事実であるか、さらに重要なことにそれを修正する方法を確認するために何を確認すればよいかわかりません。

いくつかのメモ:

  • Ubuntu を使用して libVLC をコンパイルし、libVLC wiki のハウツー ガイドに従っています。
  • C++ ファイル内で libVLC を使用しています。
  • デバッグ情報の有無にかかわらず、libVLC をコンパイルしてみました。
  • 最初の呼び出しとして libvlc_get_version と libvlc_new を呼び出してみましたが、どちらもクラッシュします。

私のリリース バージョンにはシンボルがありませんが、コール スタックを見ることができます。スタック内の関数が決して呼び出されていないことを示しているため、間違いなくめちゃくちゃになっています。これは、間違った呼び出し規則を示しているようですが、やはり私はこれを確認/修正する方法がわかりません。

それが関連しているかどうかはわかりませんが、libvlc で発生している別の問題は、dll のロードを遅らせようとしていることです (上記の問題でこれを実行しようとはしませんでしたが、違いはありませんでした)。 linker flags: /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を必要としています(私が呼び出していることは言うまでもありません)。

これに関するアドバイス/ヘルプに感謝します。ありがとう!

4

2 に答える 2

3

私はちょうど同じ問題に遭遇し、IDA逆アセンブラーを掘り下げた後、リンカーがすべてのlibvlcインポートをスローすることがわかりました。はい、INCREMENTAL フラグはそれらを追加しますが、あなたが言ったように、それは問題の説明ではありません。

Release が関数ポインタと文字列を削除したドライバを設計しているときに、同様の出来事がありました。解決策は、Linker\Optimization\References を No (/OPT:NOREF) に設定することでした。したがって、リンカーは、使用されていないと思われる場合でも、すべての参照を残します。

そしてもちろん、それは問題を解決します。

ということで、またひとつ謎が解けました。、)

宜しくお願いします Waldemar

于 2012-11-26T23:16:28.250 に答える
-1

実際、「/OPT:NOREF」を追加すると、少なくとも私の場合は問題も解決します。ffmpeg も同じ問題を抱えているため ( http://ffmpeg.org/platform.html#Linking-to-FFmpeg-with-Microsoft-Visual-C_002b_002b )、そしてffmpeg のように、libvlc (推測) は、msvc の「lib.exe」ではなく「dlltool」を使用して 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 と lib」アプローチを使用して lib ファイルを再構築できませんでした (dumpbin で失敗した場合、dll に何か問題があるはずです)。それ以上の確認はできません。

于 2015-09-15T09:11:52.167 に答える