0

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

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をアセンブリに追加するように指示する必要がありますか?もしそうなら、私はこれをどのようにするのですか?

答えて

1

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

もしそうであれば、またはそうでない場合でも、DependencyWalkerには、このサードパーティライブラリがリンクしようとしている正確なランタイムDLLを確認するのも便利です。

それはVS2005で働いているという事実は、ありませんVS2008、DLLはVS2005ランタイムのreleasemodeバージョンを使用したい意味:MSVCR80.DLL

あなたが鐘を鳴らしていないmsvc690.dllを、言及私と一緒に:Visual Studio 6は、単純にmsvcrt.dllという名前を使用しました.Visual Studioの最初のバージョンはVS2003.NETなどのバージョンです。独自のマニフェストリソースが含まれている場合は、アプリケーションマニフェストに依存するアセンブリ参照を追加するのが最も簡単です。

は、これを行うのいくつかの方法があります - あなたは

I「>追加のマニフェストファイルの構成プロパティ]> [マニフェストツール>入力と出力」XMLファイルとしてマニフェストfragementを作成し、アプリケーションに追加することができますVS2008で追加の依存アセンブリ命令をマージする最も便利な方法を見つけることは、リンカ/マニフェスト依存コマンドラインオプションを使用することです。

あなたのプロジェクト内のファイルに次のコードスニペットを追加した場合、それはリンカに必要なヒントを与えるだろう:私はバージョン番号を知らないので?? 'sがある

#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ライブラリの公開鍵トークンを利用できます。あなたがそれらを見て、それらを埋めることができれば、それは泳ぐべきです。

+0

Doh、私はmsvcr90.dllを意味しました。サードパーティのDLLには、それ自身のマニフェストが含まれていません。 Dep Walkerで開くと、msvcr80.dllに依存します。さらなる調査の後、私はこのサードパーティーのlibが赤ちゃんだと思う。私たちのライブラリの1つは、デバッグと最適化されたCRT DLLの両方にリンクしているようです。それは、第三者libに依存しているlibであることがあります。だから、それはまだ原因が判明しているかもしれませんが、私はプロジェクト設定を確実に精査しなければなりません。とにかく助けてくれてありがとう、私は多くの質問で戻ってくるかもしれない。 –

+0

デバッグ構成のプロジェクト設定で、MSVCRT.libを明示的に除外しなければなりませんでした。この答えは、元の質問に正しく答えるように表示されているようにマークします。 –

+0

第三者 "dlls"が実際に静的ライブラリでない限り、私は解決策があまり意味がないことを認めなければなりません。彼らがdllであれば、彼らはどちらの実行時のdllが必要かについてむしろ固執するべきです。サードパーティのDLLが既にリンクされているので、あなたのアプリケーションのリンカ設定を変更するべきではありません。 –

関連する問題