142

Visual Studio には、必要な C ランタイム ライブラリの種類を選択できるコンパイル フラグ /MD および /MT があります。

実装の違いは理解できましたが、どちらを使用すればよいかまだわかりません。長所/短所は何ですか?

私が聞いた /MD の利点の 1 つは、これにより誰かがランタイムを更新できることであり (おそらくセキュリティ問題にパッチを当てるなど)、私のアプリはこの更新の恩恵を受けるでしょう。私には、これはほとんど非機能のように思えます: 新しいバージョンに対してテストすることを許可せずに、人々が私のランタイムを変更することを望んでいません!

私が興味を持っているいくつかのこと:

  • これはビルド時間にどのように影響しますか? (おそらく /MT は少し遅いですか?)
  • 他の意味は何ですか?
  • 多くの人が使っているのはどれ?
4

7 に答える 7

96

/MDと動的に連動することで、

  • あなたは(良くも悪くも)システムアップデートにさらされています。
  • 実行可能ファイルを小さくすることができます (ライブラリが埋め込まれていないため)。
  • 少なくとも DLL のコード セグメントは、それをアクティブに使用しているすべてのプロセス間で共有されていると思います (消費される RAM の総量を減らします)。

また、実際には、さまざまなランタイム オプションでビルドされた、静的にリンクされたサードパーティのバイナリのみのライブラリを使用する場合、メイン アプリケーションの /MT は /MD よりもはるかに頻繁に競合を引き起こす傾向があることもわかりました ( C ランタイムが複数回静的にリンクされている場合、特にバージョンが異なる場合は問題が発生します)。

于 2009-04-16T18:49:54.403 に答える
44

DLL を使用している場合は、動的にリンクされた CRT (/MD) を使用する必要があります。

.exe とすべての .dll に動的 CRT を使用する場合、それらはすべて CRT の単一の実装を共有します。つまり、それらはすべて単一の CRT ヒープを共有し、1 つの .exe/.dll に割り当てられたメモリを解放できます。別。

.exe とすべての .dll に静的 CRT を使用する場合、それらはすべて CRT の個別のコピーを取得します。つまり、それらはすべて独自の CRT ヒープを使用するため、同じモジュールでメモリを解放する必要があります。割り当てられました。また、コードの肥大化 (CRT の複数のコピー) と過剰なランタイム オーバーヘッド (各ヒープは OS からメモリを割り当ててその状態を追跡するため、オーバーヘッドが顕著になる可能性があります) にも悩まされます。

于 2009-09-04T07:11:58.447 に答える
25

Visual Studio でビルドされたプロジェクトのデフォルトは /MD だと思います。

/MT を使用すると、実行可能ファイルはターゲット システムに存在する DLL に依存しません。これをインストーラーにラップする場合、おそらく問題にはならず、どちらの方法でもかまいません。

私は /MT を自分で使用しているので、DLL の混乱全体を無視できます。

PS Fooz 氏が指摘するように、一貫性を保つことが重要です。他のライブラリとリンクしている場合は、それらと同じオプションを使用する必要があります。サード パーティの DLL を使用している場合は、ランタイム ライブラリの DLL バージョンを使用する必要があることはほぼ確実です。

于 2009-04-16T18:28:13.567 に答える
15

/MT で静的にリンクすることを好みます。

/MD を使用してより小さな実行可能ファイルを取得したとしても、ユーザーがプログラムを実行するための適切なバージョンを確実に入手できるように、多数の DLL を出荷する必要があります。最終的に、インストーラーは /MT でリンクする場合よりも大きくなります。

さらに悪いことに、ランタイム ライブラリを Windows ディレクトリに配置することを選択した場合、遅かれ早かれ、ユーザーは別のライブラリを使用して新しいアプリケーションをインストールし、運が悪ければアプリケーションが壊れてしまいます。

于 2009-04-16T18:59:20.497 に答える
8

/MD で発生する問題は、CRT のターゲット バージョンがユーザーのコンピューターにない可能性があることです (特に、最新バージョンの Visual Studio を使用していて、ユーザーが古いオペレーティング システムを使用している場合)。

その場合、適切なバージョンをマシンにインストールする方法を理解する必要があります。

于 2009-04-16T19:00:54.470 に答える
7

http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspxから:

/MT _MT を定義して、ランタイム ルーチンのマルチスレッド固有のバージョンが標準ヘッダー (.h) ファイルから選択されるようにします。また、このオプションにより、コンパイラはライブラリ名 LIBCMT.lib を .obj ファイルに配置し、リンカが LIBCMT.lib を使用して外部シンボルを解決できるようにします。マルチスレッド プログラムを作成するには、/MT または /MD (またはそれらに相当するデバッグ用の /MTd または /MDd) が必要です。

/MD _MT と _DLL を定義して、ランタイム ルーチンのマルチスレッド固有バージョンと DLL 固有バージョンの両方が標準の .h ファイルから選択されるようにします。また、このオプションにより、コンパイラはライブラリ名 MSVCRT.lib を .obj ファイルに配置します。

このオプションでコンパイルされたアプリケーションは、MSVCRT.lib に静的にリンクされます。このライブラリは、リンカが外部参照を解決できるようにするコード層を提供します。実際に動作するコードは MSVCR71.DLL に含まれており、MSVCRT.lib にリンクされたアプリケーションが実行時に利用できる必要があります。

/MD を _STATIC_CPPLIB 定義 (/D_STATIC_CPPLIB) と共に使用すると、アプリケーションは動的バージョン (msvcprt.lib) ではなく、静的マルチスレッド標準 C++ ライブラリ (libcpmt.lib) とリンクしますが、メイン CRT には引き続き動的にリンクします。 msvcrt.lib.

したがって、正しく解釈している場合、/MTは静的にリンクし、/MDは動的にリンクします。

于 2009-04-16T18:33:38.013 に答える
2

他の dll または lib を使用する実行可能ファイルをビルドする場合は、/MD オプションを使用することをお勧めします。これは、すべてのコンポーネントが同じライブラリを共有するためです。もちろん、このオプションは関連するすべてのモジュール、つまり dll/lib/exe に一致する必要があります。

実行可能ファイルが、誰の呼び出しよりも lib または dll を使用しない場合。共有の側面が機能していないため、違いはそれほど大きくありません.

/MT を使用してアプリケーションを開始することもできますが、それ以外にやむを得ない理由はないため、lib または dll を追加するときは、lib/dll のそれを使用して /MD に変更できます。これは簡単です。

于 2014-03-11T19:32:50.053 に答える