Visual C++ 2008 に問題があります。opencv をインストールし、新しいプログラムを作成しましたが、エラーなしでビルドしました。ただし、デバッグ時に MSVCR90D.dll が見つからないと文句を言います。リリースモードでは全く問題ありません。
Winsxs フォルダーの 1 つに MSVCR90D.dll があります。この問題の回避策を知っている人はいますか? これは既知のバグですか?
ジェラルド
Visual C++ 2008 に問題があります。opencv をインストールし、新しいプログラムを作成しましたが、エラーなしでビルドしました。ただし、デバッグ時に MSVCR90D.dll が見つからないと文句を言います。リリースモードでは全く問題ありません。
Winsxs フォルダーの 1 つに MSVCR90D.dll があります。この問題の回避策を知っている人はいますか? これは既知のバグですか?
ジェラルド
このフォーラムの投稿で説明されているいくつかの潜在的な解決策があります。それらのいずれかが役立つかどうかを確認してください。
そこからの1つのヒント:
%System Drive%\ Windows \ WinSxSに移動し、ディレクトリx86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456を探します。
これが存在しない場合は、VSセットアップに移動し、すべてのライブラリがVC++でインストールされていることを確認してください。
そしてもう1つ:
同じ問題が発生しましたが、インクリメンタルリンクをオフにすることで修正しました(プロジェクトのプロパティ...リンカー...一般...インクリメンタルリンクを有効にする:いいえ)。
最後のものを確認する:
ソフトウェアにマウントされたドライブ上に構築されたプロジェクトは、MSVCR90D.dllの欠落について不平を言います。インクリメンタルリンクをオフにすると(もちろん、すべてを再構築すると)、問題は解決します。
同じ問題があり、VS9.0 インストールのデバッグ DLL につながる投稿を見つけました。デフォルトのインストールでは、次の場所にありC:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT
ました。
3 つの DLL とマニフェスト ファイルがあります。これらをSystem32
ディレクトリに追加したり、ディレクトリをPATH
環境変数に追加したり、デバッグ時にファイルを実行可能ファイルと同じディレクトリにコピーしたりできます。
インクリメンタル リンクにより、ビルドが高速化されます (リンカーは、プロジェクト全体を再リンクするのではなく、変更されたライブラリのみを再リンクします)。それ以外の場合、ビルド出力には影響しません。大規模なプロジェクトの場合、インクリメンタル リンクをオフにすることはお勧めしません。
別のVC9.0プロジェクトがうまくいきましたが、同じ問題がありました。そこで、両方のプロジェクト設定を比較しました。決定的な違いは、'Project Properties' -> 'Configuration Properties' -> 'Manifest Tool' -> 'Input and Output' -> 'Embed Manifest' の下にありました。このオプションは YES に設定する必要があります。
Dependency Walkerを使用すると、DLLの問題のトラブルシューティングがはるかに簡単になります。これにより、アプリケーションのプロファイルを作成し、起動時にロードされたDLLと後でロードされたDLLの両方をキャッチできます。DLLのロード、またはDLLのロードの失敗に関連する多くのメッセージを吐き出します。また、DLLのSxSロードも理解します。
EXEを引数としてDepends.EXEに渡すと、そのアプリのプロファイルが作成されます。これは、ほとんどのIDEと組み合わせることができます。たとえば、Visual Studioでは、「デバッグ用コマンド」を設定できます。デフォルトでは、これは独自のEXEです。これをdepends.EXEに変更し、コマンド引数を(少なくとも)に設定し/pb your.debug.exe
ます。
以下のような同じ問題を解決しました:
これを行うと、プロジェクトに依存する dll が埋め込まれ、依存関係の問題が回避されます。
注:私はdllプロジェクトに取り組んでおり、その問題がありました。上記の手順を実行した後、私の状況ではうまくいきました。
関数 File->New->Project From Existing Code を使用して、VC++ 2008 でプロジェクトを再コンパイルします。それは私自身を助けました、おそらくそれはあなたを助けるでしょう。よろしく。
これが、私が静的にリンクする理由の1つです。より大きなEXEですが、これまでにこのような依存関係の問題が発生したことはありません。おそらくそれ自体で質問する価値があります...
提案されたすべての解決策を試してみましたが、運がありませんでした。最終的に、マニフェストが"C:\WINDOWS\WinSxS\Manifests"
フォルダーにないことがわかりました。
C:\WINDOWS\WinSxS
dll があるフォルダーを見つけます。C:\WINDOWS\WinSxS\Manifests
dll のフォルダー名と一致するマニフェストがあるかどうかを確認します。マニフェストが見つからない場合は、別のマシンから正しいマニフェストをコピーして、マニフェスト フォルダーに貼り付けます。マニフェスト ファイル名は次のとおりです。
"x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456.cat"
"x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456.manifest"
問題がありました:
ファイルまたはアセンブリ 'AudioInterface, Version=1.0.3548.29920, Culture=neutral, PublicKeyToken=null' またはその依存関係の 1 つを読み込めませんでした。アプリケーションの構成が正しくないため、このアプリケーションを開始できませんでした。アプリケーションを再インストールすると、この問題が解決する場合があります。(HRESULT からの例外: 0x800736B1)
AudioInterface は私の C++ プロジェクトの名前です。
「リリース」構成に切り替えると、すべてが機能しました。
DLL と一緒にマニフェスト ファイルがないことを追跡し、アセンブリ ID が設定されていることをさらに追跡しました。(プロパティ > マニフェスト ツール > 一般 > アセンブリ ID)
この設定を削除すると、マニフェストが適切な場所にドロップされ、すべてが機能しました。
決定的な解決策を示すことはできませんが、役立つリンクがいくつかあります。
もちろん、リンクをたどれば、MSDN にはさらに多くの情報があります。
同様の問題に直面しましたが、説明されている解決策はどれもうまくいきませんでした。
最後に、問題を解決するために次のことを行いました。
ステップ-1: @ user176861 の提案に従ってください
ステップ-2: VC++ プロジェクトのプロパティ -> 構成プロパティ -> リンカー -> マニフェスト ファイル: 「追加のマニフェストの依存関係」に以下を追加します。
type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'
上記の変更を行った後、デバッグできました。