3

似たような質問がいくつかあることは知っていますが、私の要件と本当に同じ要件があるとは思いません。

当社の DLL は Visual Studio 2005 でコンパイルされており、インストールの制約により、特定のバージョンの CRT とリンクする必要があります。これは絶対です。最新バージョンで再コンパイルすることは解決策ではありません。

最近、Boost ライブラリを更新しました。ただし、Boost をビルドすると、自動的に最新の CRT が使用されました。ここで、Boost をプログラムにリンクすると、CRT の最新 (間違った) バージョンと CRT の古い (正しい) バージョンの両方に依存関係が作成されます。最新バージョンへの依存関係をなくす必要があります。

この問題の最善の解決策は何ですか? 現時点で考えられる最善の方法は、古いバージョンを使用して Boost を再構築することですが、ソースを変更せずに簡単に再構築する方法がわかりません。

Visual Studio で特定のバージョンの CRT をグローバルに (プロジェクトごとではなく) 使用するように強制する方法があれば、それは素晴らしいことです。または、CRT の最新バージョンを単純に削除する方法ですが、OS の一部と見なされているため、それは不可能だと確信しています。

4

3 に答える 3

5

私の知る限り、異なるバージョンの CRT を使用することはお勧めしません。.NET 2.0 dll から .NET 1.1 dll を参照できる .NET とは異なり、Unmanaged にはその柔軟性がありません。

新しい CRT を使用するように dll をアップグレードすることはできないため、できることは VS2005 で Boost を再構築することだけです。

また、異なる CRT の 2 つの dll をリンクすることはお勧めしません。メモリ破損などの問題が発生する可能性があります。

注: 各 Visual Studio には、すべての dll が参照する既定の CRT バージョンがあります。

また、「新しい CRT を取り外す」ということもわかりませんでした。使用する Visual Studio のバージョンごとに Visual Studio Redist をインストールする必要があります。(その redist には CRT dll が含まれています) http://msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx

于 2010-03-08T17:00:31.390 に答える
3

解決策は、埋め込みマニフェストを手動で変更して、最新の CRT への依存関係を削除することでした。これは、CRT が動的にリンクされて構築されているためです。ただし、これの安全性には疑問があります。

何らかの理由で、Boost ビルド プロセス中に targetsxs ファイルを強制的に含めても、指定された CRT をターゲットにするように強制されませんでした。

于 2010-03-09T15:41:32.413 に答える
0

ブースト プロジェクト内のどのコンストラクトが間違った CRT への依存関係を挿入しているかを正確に見つけ、そのコンストラクトを削除/変更する必要があります。.vcproj ファイルやマニフェストなどに含まれている可能性があります。

VC++ 2005 と VC++ 2008 の CRT には、多かれ少なかれ同じプリミティブが含まれています。VC++ 2005 でブーストを完全に再コンパイルするか、少し調整してから再コンパイルすることができます。はい、これには多少の努力が必要ですが、これが唯一の方法です。コードとブースト コードの両方を、使用する CRT のバージョンに対してコンパイルする必要があります。

于 2010-03-09T15:48:55.967 に答える