11

Visual C++ 2008 の質問で MSVCR90D.dll がデバッグ モードで見つからないことがわかりましたが、与えられた回答のどれも実際に質問に対する回答を与えていません。それらのほとんどは、インクリメンタル リンクをオフにすることを指摘していますが、エラーの真の原因と、インクリメンタル リンクをオフにせずに修正する方法については説明していません。

私の状況は、元の質問の状況とは少し異なります。Visual Studio 2008 の C++ コンパイラを使用していますが、Visual Studio 内ではなく Qt Creator 内で使用しています。

誰?

4

7 に答える 7

11

デバッグCRTがsxsフォルダーから完全に欠落しているエラーの場合は、VS2008 ServicePack1をインストールするだけで問題が解決します。

これは、64ビットWindows7へのVS2008の新規インストールとVC++プロジェクトを含むソリューションで発生しました。実行時にC++アセンブリがロードされると、デバッグビルドがクラッシュし、サイドバイサイドエラーが発生しました。

VistaおよびWin7(XPではない)では、SxSエラーは、ロードを試みて失敗したアセンブリの詳細を示します。この場合は、VC90.DebugCRT9.0.22.19でした。VCアセンブリの(埋め込まれた)マニフェストを確認しました。確かに、このアセンブリとバージョンへの参照が含まれていました。

sxsディレクトリ(%System Drive%\ Windows \ WinSxS)を確認すると、VC90DebugCRTが並列にインストールされていないことがわかりました。VC ++ランタイムをインストールしましたが、これらにはデバッグランタイムが含まれていません。VS2008は、デバッグランタイムをインストールすることを目的としていますが、そこにはありませんでした。

VS2008の元のリリースでは 、64ビットのVC ++ DebugCRTはインストールされていませんが、SP1をインストールするとインストールされます。これを実行すると、ランタイム例外やサイドバイサイドエラーはなくなります。

于 2010-08-05T06:53:59.133 に答える
6
  1. Dependency Walkerを使用して、プログラムで検出しようとしている msvcr90d.dll のバージョンを調べることができます。あなたが持っていないmsvcr90d.dllのいくつかのバージョンにリンクされたサードパーティのコンポーネントである可能性があります。
  2. manifest.xml ファイルを確認する必要があります。不要な依存関係をすべて削除してみてください。
于 2009-07-19T18:47:08.930 に答える
4

以下はコンパイラからの出力です。2 回目のビルドの実行が成功するのは奇妙です。ただし、問題は、マニフェストから実行可能ファイルに情報を埋め込む責任がある mt.exe の実行に関するこのエラーが原因である可能性があると思われます...

Generating Code...
link /LIBPATH:"c:\Qt\4.5.2-vc\lib" /NOLOGO /DEBUG /MANIFEST /MANIFESTFILE:"debug\formExtractor.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:debug\formExtractor.exe @.\nmD932.tmp
mt.exe -nologo -manifest "debug\formExtractor.intermediate.manifest" -outputresource:debug\formExtractor.exe;1
'mt.exe' is not recognized as an internal or external command,
operable program or batch file.
NMAKE : fatal error U1077: 'mt.exe' : return code '0x1'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.
Exited with code 2.

アップデート

リンク処理中に mt.exe を実行できなかったことが問題の原因でした。Windows SDKC:\Program Files\Microsoft SDKs\Windows\v6.0A\binへのパス ( ) を PATH 環境変数に追加したところ、実行可能ファイルを実行できるようになりました。

さまざまな回答へのコメント;


@シェイ

sxstrace からの出力 txt ファイルが空です。理由がわかりません。ただし、アプリケーション ログには次の情報があります。

Faulting application formExtractor.exe, version 0.0.0.0, time stamp 0x4a638ee1, faulting module MSVCR90D.dll, version 6.0.6002.18005, time stamp 0x49e03824, exception code 0xc0000135, fault offset 0x0006f04e, process id 0xf68, application start time 0x01ca08ba801ac5cf.

バージョン 6.0.6002.18005?
何じゃこりゃ?


@Kirill V. Lyadvinsky

Dependency Walker は、次のファイルでmsvcr90d.dll使用されていることを発見しましたqtwebkit4.dll
c:\windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\MSVCR90D.DLL

msvcr90d.dllしかし、実行可能ファイルによって直接リンクされた(他のバージョンの?) ファイルが見つかりません。しかし、DW はそのバージョンをどこにも示していないようですよね?

formExtractor.intermediate.manifest ファイルのコンテスト

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

msvcr90d.dllマニフェスト ファイルから、実行可能ファイルが とは異なるバージョンにリンクされているように見えますqtwebkit4.dll。奇妙なのは、 の両方のバージョンが次のサブフォルダーのフォルダーにmsvcr90d.dll存在し 、 c:\windows\winsxs
x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb

何か案は?


@騎士666

現在使用しているコンパイラとまったく同じものを使用してコンパイルした Qt フレームワークを使用しているので、ここに不一致はないと思います。さらに、依存関係ウォーカーは、不足しているファイルが実行可能ファイルに直接msvcr90d.dllリンクされていることを示しているため、サードパーティのライブラリのせいではないと思います。

于 2009-07-19T20:08:37.767 に答える
3

免責事項: 私は本物の Win32 マスターではありません :)

Qt Creator を使用したことはありませんが、exe の適切なマニフェストを作成しますか?
マニフェストが別のバージョン (SP1 など) 用で、RTM バージョンしかない可能性があります。
Vistaをお使いですか?SxsTraceを実行して、サイド バイ サイドの問題を診断できます。

于 2009-07-19T18:08:42.067 に答える
3

更新: 私の場合、vc++ 2008 Express には 'Use FAT32 Work-around' (構成プロパティの "manifest tool" ページにあります) があることがわかりました。これで問題は解決します。このオプションのヘルプ情報では、FAT32 ドライブ/パーティションのタイム スタンプに 2 秒の遅延があり、mt.exe が正常に動作しないことが説明されています。これは、問題のややランダムな動作を説明しているようです。

于 2009-08-05T14:11:20.290 に答える
1

msvcr90d.dll が vs2008 C++ Express ed に見つからないという同じ問題があります。インクリメンタル リンクが有効な場合、出力 .exe に埋め込まれたマニフェストは次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
</assembly>

msvcr90d.dll が見つからないのも不思議ではありません。

私は2つのことを試しました:

A. 16 進エディタを使用すると、上記は ./Debug/XXX.embed.manifest にある <assembly> の内容で上書きされます。

B. mt.exe -manifest ./Debug/XXX.embed.manifest -outputresource:./Debug/XXX.exe を使用します。

どちらの方法も機能するようです。ビルド後のイベント コマンドとして 2 番目の方法を使用しました。

mt.exe -verbose -manifest ./$(構成名)/$(対象ファイル名).embed.manifest -outputresource:./$(構成名)/$(対象ファイル名)

インクリメンタル リンクが有効になっているときに、「間違った」マニフェストが 1 番目の場所に埋め込まれている理由がわかりません。誰かが理由を知っているなら、投稿してください。

ありがとう!

レックス

于 2009-08-04T22:23:59.887 に答える
1

バージョンの不一致がある可能性はありますか?Ogre でも同様のことがありました。SDK をコンパイルするには、最新バージョンのサードパーティ ライブラリを使用して SDK を再コンパイルする必要がありました。

于 2009-07-19T20:02:54.190 に答える