3

この質問を繰り返しとして却下する前に、この質問は SO に関する他の多くの同様の質問とは異なります。これは、エラー メッセージ内の関数がDLLとはまったく関係がないためです。

アプリとバージョン情報

MATLAB Compiler 4.17 (R2012a) で生成された DLL、Glib (2.32.4、GStreamer SDK 2012.9 32 ビットのバイナリ)、および Qt (4.8.3-vs2008) を使用する Visual Studio 2008 RTM の 32 ビット アプリがあります。 )、すべて Windows 7 x64 SP1 で実行されます。

問題

デバッグ ビルドは正常に実行されますが、リリースでは、悪名高いThe procedure entry point libXXXInitialize could not be located in the dynamic link library libglib-2.0-0.dll.The libXXXInitialize function (MATLAB ベースの DLL に存在する) は、libglib-2.0-0.dllとはまったく無関係です。

私の研究

すべてのライブラリが VS2008 でコンパイルされていることを確認し (mingw でコンパイルされた GStreamer/GLib を除きますが、それはストレート C であるため問題はないはずです)、DLL の他のバージョンを確認しました。道。ある種のリンカーの問題に違いないようです。

更新 1

Dependency Walker x86 では、これはlibXXXInitializelibglib-2.0-0.dll だけでなく、他のすべての GLib/GStreamer DLL からの未解決の (親) インポートとしても表示されますが、関数は DLL 内の本来あるべき場所で正しく解決されます。 libXXX.dll が見つかりました。

更新 2

libXXXInitializeMATLAB Compiler Runtime への呼び出しと呼び出しを削除したmclInitializeApplicationところ、glib DLL からその関数を解決できなくなりました。

しかし、解決策(少なくとも一時的) を見つけて、リンカー オプションを から に変更して問題/OPT:REF/OPT:NOREF修正しました (そのため、リンカーは「決して参照されない関数やデータを保持します。奇妙なことに、私は確かにmclInitializeApplication関数を明示的に使用しています。をオンにし/VERBOSE:REFても、削除されたことが表示されません。

アップデート 3

binutilsのバグトラッカーで、最終的にこれについての言及を別の場所で見つけました。これは、GStreamer SDK の一部としてMSVC2010 プロパティ シートで見つけました。推奨される回避策は、OptimizeReferences を無効にして、私が既に行っていることです。

なぜこれが起こっているのか誰かが教えてくれたら、答えとしてマークします。

4

0 に答える 0