0

Visual Studio 2005 を使用して Windows でビルドするために、最近 Linux/gcc から移植した C++ アプリケーションがあります。このアプリは、最適化された CRT DLL を使用する DLL のみを提供するサードパーティ ライブラリを使用します (つまり、デバッグ CRT DLL)。VS2005 では、これは問題ではないようでした。デバッグ ビルドは、System32 ディレクトリに最適化された CRT DLL を見つけました。

現在、VS2008 でアプリをビルドして実行しようとしていますが、最適化された CRT DLL (msvc690.dll) が見つからないため、デバッグ ビルドを実行できません。VC9 CRT DLL は、GUID スタイル名のディレクトリに配置されています。これはサイド バイ サイド アセンブリであり、アプリはアプリのマニフェストを使用してそれを見つけることになっていると思います。ただし、ビルドされてアプリ exe に埋め込まれたマニフェストは、デバッグ CRT アセンブリのみを指定します。

<?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.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

私は Windows の専門家ではないので (少なくとも今はそうではありません)、これは私にとってまったく新しいことです。ここで正しい解決策は何ですか?マニフェスト コンパイラに、最適化された CRT DLL をアセンブリに追加するように指示する必要がありますか? もしそうなら、どうすればいいですか?

4

1 に答える 1

1

Ok。VS 2008 でサード パーティのライブラリ dll を開くと (OpenWith > Resource Editor を選択していることを確認してください)、独自のマニフェストが含まれていますか?

含まれている場合、または含まれていない場合でも、DependencyWalkerを取得して、このサード パーティ ライブラリがリンクしようとしている正確なランタイム dll を確認することも役立ちます。

VS2008 ではなく VS2005 で動作したという事実は、dll が VS2005 ランタイムのリリースモード バージョンを使用したいことを意味します: msvcr80.dll

あなたはmsvc690.dllに言及していますが、これは私と一緒にベルを鳴らしません.Visual Studio 6は単にmsvcrt.dllという名前を使用しました-バージョン管理されたdllランタイムを使用するVisual Studioの最初のバージョンはVS 2003 .NETか何かでした:msvcrt7.dll

とにかく、サード パーティ ライブラリに独自のマニフェスト リソースが含まれていない場合、最も簡単な方法は、アプリケーション マニフェストに依存アセンブリ参照を追加することです。

これを行うにはいくつかの方法があります。マニフェスト フラグメントを XML ファイルとして作成し、それをアプリケーションに追加できます ([構成プロパティ] > [マニフェスト ツール] > [入力と出力] > [追加のマニフェスト ファイル])。

VS2008 で追加の依存アセンブリ ディレクティブをマージする最も便利な方法は、リンカーの /manifestdependency コマンド ライン オプションを使用することです。

プロジェクト内のファイルに次のコード スニペットを追加すると、リンカに必要なヒントが与えられます。

#define X_CRT_ASSEMBLY_VERSION "9.0.21022.8"
#pragma comment(linker,"/manifestdependency:\"type='win32' "\
    "name='"Microsoft.VC80.CRT' "
    "version='8.0.??.??' "                         \
    "processorArchitecture='x86' "                                 \
    "publicKeyToken='????????'\"")

VS2005 ライブラリのバージョン番号や公​​開鍵トークンがわかりません。それらを調べて埋めることができれば、うまくいくはずです。

于 2009-08-20T10:25:47.003 に答える