2011-07-18 18 views
1

私はいくつかのWindows OSで動作しないように配布しているDLLを持っています。 dependancy walkerを使用すると、これらのシステムでmsvcp90d.dllが見つからないことがわかります。 I は、C++再配布可能ファイルを必要とするランタイム依存を必要とせず、DLLを呼び出すアプリケーションはC++で記述されていないため、C++再配布可能ファイルに依存しません。Windowsバイナリからmsvcp90d.dllの依存関係を削除する

私はリンカの設定でDEBUGオプションを残したと思いますが、DLLをコンパイルしたときにmsvcp90d.dllが必要なのはなぜですか?

を追加しました: Appologiesは、私が

DLLは私が書いていないサードパーティ製のDLLです...モニターの前に....私の元の質問にはあまりにも多くの時間を間違ったDLL名を貼り付けVS2008で私によってコンパイルされました。

+0

msvcp90d?あなたはダイナミックリンクを使用するだけでなく、デバッグを残したようです。 msbuildスクリプトを使用してこのDLLを繰り返し作成することをお勧めしますか?私はあなたがIDEからビルドしていないことを願っています! –

答えて

3

MSVCP90はデバッグとは関係ありません(msvcp90 d)。コンパイラを/ MDの代わりに/ MTに切り替えることによって、依存関係を削除できます。また、リンクしているすべての静的ライブラリもコンパイルされていることを確認する必要があります。

私は、システムパフォーマンスに重大な悪影響を及ぼし、CRTのセキュリティ問題が発生した場合にサービスに長時間を要するため、apps/MTを構築することをお勧めします。

最後に、/ MTはCRTがプライベートであることを示します。したがって、CRT/STLタイプがDLL境界を通過しないようにする必要があります。

マーティン

+1

「システムパフォーマンスに重大な悪影響が及ぶ」詳細を教えてください。 –

+0

申し訳ありませんが、元の質問に間違ったdllの名前を貼り付けました –

+0

@David - 誰もがmsvcp90(通常はwinsxsにあります)を読み込むと、OSはすべてのプロセスに対して1セットのページしか費やしません。あなたが静的なリンクをしている場合、同じコードがたくさん読み込まれ、多くのページが無駄になります。追加の静的リンクの人それぞれに全体的な影響が重要です。 –

1

dllがVisual Studio 2008でコンパイルされている可能性が最も高いため、MSVCP90.dllが必要です。それがリリースランタイムです。簡単な答えは、C++のランタイム依存関係でC++のライブラリやアプリケーションを使用したくない場合です。

あなたはあなたの問題を解決するために、次のいずれかの操作を行うことができますしかし:

  1. は、アプリケーション
  2. 再コンパイルからそのDLLに依存関係を削除し、依存関係
  3. を満たすために、ターゲットシステムに再配布可能ファイルをインストールします。あなたが望むVCのバージョンに対するDLLは既にターゲットシステムに存在しています
+0

申し訳ありませんが、元の質問に間違ったdllの名前を貼り付けました –

+0

ああ、単にリリースでDLLをコンパイルするだけで十分でしょう。ほとんどのWindowsシステムでは、すでにリリースランタイムの再配布可能ファイルが用意されています。 – AJG85

2

あなたのオプション私はそれらを見るように:

  1. は、Cランタイムに静的リンクを使用するには/ MTオプションを使用してDLLをコンパイルします。
  2. ランタイムへのダイナミックリンクを続行しますが、Cランタイムはアプリと共に配布してください。
+0

+1静的リンク+1私はめったに肥大または他の問題が付属しているので、そのオプションを外しました/ MT – AJG85

+2

@ AJG85静的リンクが大好きです。私はランタイムを再配布することが嫌いです。私たちが言うようにコースのための馬。 –

+0

私は静的リンクも大好きです。 Appologies、私は元の質問に間違ったdllの名前を貼り付けた –

関連する問題