web-dev-qa-db-ja.com

Microsoft Visual Studio〜C / C ++ランタイムライブラリ〜静的/動的リンク

私はMicrosoft Visual Studioユーザーです。私の質問は「C/C++ Runtime Library」についてです。

次のコードを含む「.cpp」ソースファイル「main.cpp」で「空のプロジェクト」を作成しました。

#include <iostream>

int main(void)
{
    std::cout << "Hello World" << std::endl;
    return 0;
}

「iostreamは、C++プログラミング言語の入出力に使用されるヘッダーファイルです。C++標準ライブラリの一部です。」

  1. 「C/C++ Runtime Library」と「C/C++ Standard Library」に違いはありますか?

  2. 「C/C++ Runtime Library」ライブラリがプロジェクトに静的または動的にリンクされているかどうかを知るにはどうすればよいですか?

  3. このライブラリがファイルシステム内のどこにあるかを知るにはどうすればよいですか?

  4. 「C/C++ Runtime Library」がプロジェクトに動的にリンクされている場合、どの「.dll」が使用され、使用された「.dll」がファイルシステムのどこにあるのかを知るにはどうすればよいですか?

  5. 「C/C++ Runtime Library」をプロジェクトに静的にリンクするとします。ソースコードから生成された実行可能ファイルがすべてのWindowsプラットフォーム(XP/Vista/Seven/...、32ビット/ 64ビット)?

  6. 「C/C++ Runtime Library」をプロジェクトに動的にリンクすることの利点/欠点は何ですか?

  7. 「C/C++ランタイムライブラリ」をプロジェクトに静的または動的にリンクする必要がありますか?

41
Léa Massiot

「C/C++ Runtime Library」という用語は何も意味せず、IDEのプロジェクト設定の名前にほぼ相当します。プロジェクト+プロパティ、C/C++、コード生成、ランタイムライブラリ設定。そこで、/ MDと/ MTを選択できます。

/ MD(デフォルト設定)を使用すると、プログラムはDLLバージョンのランタイムライブラリを使用します。マシン上では、c:\ windows\system32またはc:\ windowsにコピーされました。 Visual Studioインストーラーによる\ syswow64そして、VSインストールディレクトリのvc/redistサブディレクトリにそれらのコピーがあり、プログラムのインストーラーを作成するときに使用できます。 -bit Intelプロセッサ、64ビットIntelプロセッサ用x64、およびARMプロセッサ用arm。プロジェクトで選択したプラットフォームに基づいて適切なプロセッサを選択します。

関連するDLL名前は次のとおりです。

  • msvcr110.dll:Cランタイムライブラリ(memcpyなど)
  • msvcp110.dll:C++標準ライブラリ(std :: stringなど)
  • vccorlib110.dll:Windowsストアアプリケーションのランタイムライブラリ
  • vcomp110.dll:OpenMPのランタイムライブラリ(#pragma ompを参照)
  • atl110.dll:ATLプロジェクトのランタイムライブラリ
  • mfc110 * .dll:MFCプロジェクトのランタイムおよびローカリゼーションライブラリ
  • vcamp110.dll:AMPプロジェクトのランタイムライブラリ

マシンには、これらのDLLのデバッグビルドもあり、VSインストーラーによってWindowsディレクトリにコピーされています。同じ名前に「d」という文字が追加されています。コードのデバッグにのみ有用であり、コードを再配布することはできません。対応するランタイムライブラリ設定は/ MDdです。

ほとんどのC++プロジェクトに必要なのはmsvcr110.dllとmsvcp110.dllだけです。特定のプロジェクトテンプレートとそれらの設定があるので、他のライブラリを使用することを選択したときにわかります。

これらすべてのDLLをユーザーのマシンにインストールする簡単な方法は、ビルド済みインストーラーを使用することです。あなたはそれをダウンロードすることができます ここから (注:現在の時点でのみ、これはサービスパックまたはアップデートが利用可能になったときに変更される可能性があります)。または、メインEXEと同じディレクトリに単純にコピーできます。

ランタイムライブラリの設定を/ MTに変更することにより、これらのDLLに依存することを回避できます。その場合、ランタイムサポートコードはプログラムにリンクされ、展開するEXEは1つだけになります。もちろん、そうすると大きくなりますが、MFCを使用している場合は特に大きくなります。

DLLとEXEを作成する場合、/ MTの使用は危険です。プログラムでCRTの複数のコピーが作成されます。これは特にVSの以前のバージョンでは問題でした。VS2012では、各CRTが独自のヒープを取得していました。ただし、たとえば、「errno」変数が複数ある場合、実行時に問題が発生する可能性があります。このような損失を回避するために、/ MDを使用することを強くお勧めします。

プログラムはWindows Vista、7および8で実行されます。XPのサポートは減少しています。VSUpdate 1が必要であり、プロジェクトのツールセット設定を "v110"から "v110_xp"に変更します。まだXP上で実行されるプログラムを作成するには、ロケールとスレッドローカルストレージに関連付けられている一部の機能が失われるため、テストが必要です。

59
Hans Passant

ここには何もありません...間違いを見つけたらチャイムでお願いします。

1。 「C/C++ Runtime Library」と「C/C++ Standard Library」に違いはありますか?

はいといいえ。ランタイムライブラリを使用してすべてを意味し、標準ライブラリを完全に無視する場合があります(Microsoftツールの場合)。ただし、技術的には、ランタイムライブラリは実行時にロードされるため、.lib(インポートライブラリ)と.dllのペアが含まれます。詳細はこちらをご覧ください: http://msdn.Microsoft.com/en-us/library/vstudio/abx4dbyh(v = vs.100).aspx

技術的には、libc *は標準ライブラリであり、* crtはランタイムライブラリです。

2。 「C/C++ Runtime Library」ライブラリがプロジェクトに静的または動的にリンクされているかどうかを知るにはどうすればよいですか?

IDE(VS2010、その他も同様)を使用している場合、これはプロジェクトプロパティにあります。

-  configuration properties
        - c/c++
               - code generation
                      [Runtime Library]

3。このライブラリがファイルシステムのどこにあるかを知るにはどうすればよいですか?

Libファイルは、sdkのlibディレクトリ(後のWindows SDKをインストールした場合)またはVisual C++ディレクトリにあります。

4。 「C/C++ Runtime Library」がプロジェクトに動的にリンクされている場合、どの「.dll」が使用され、使用された「.dll」がファイルシステムのどこにあるのかを知るにはどうすればよいですか?

Dependツールを使用して、使用されているものを把握できます。 http://www.dependencywalker.com/

DLLはWindowsディレクトリのどこかにあります。彼らはそれらを動かし、今ではバージョンを追跡するためのマニフェストやものを備えたファンキーな場所にあります。私はこれについてあまり心配しません。これを心配する必要がある場合は、おそらく何かが間違っています。詳細: http://msdn.Microsoft.com/en-us/library/windows/desktop/aa375365(v = vs.85).aspxhttp:// en。 wikipedia.org/wiki/Side-by-side_Assembly

これが懸念される場合は、再配布可能なパッケージをインストーラーにバンドルできます。 Visual Studio RedistributableとVisual Studio SP1の違い

5。 「C/C++ Runtime Library」をプロジェクトに静的にリンクするとします。ソースコードから生成された実行可能ファイルがすべてのWindowsプラットフォーム(XP/Vista/Seven/...、32ビット/ 64)で動作することを確認できますビット)?

はい、静的にリンクする場合、dllを見つけられないという点で安全です。ただし、これにより実行可能ファイルが大きくなります。動作に関して他の結果があります...列挙することは困難ですが、違いは、ライブラリがdllにあるのと、exeにコンパイルされているという事実にあります。

6。 「C/C++ Runtime Library」をプロジェクトに動的にリンクすることの利点/欠点は何ですか?

Dllを使用する理由:

a-サイズ。すべてのライブラリの内容は、ユーザーのシステムに既にインストールされているはずのdllにあるため、より小さいexeサイズ。

b-ランタイムにバグがある場合、Microsoftは新しいリリースをユーザーにプッシュダウンできます。あなたはそれに対処する必要はありません。静的にリンクする場合は、新しいexeをユーザーにプッシュする必要があります。

Dllを使用しない理由:

a-dllの処理に関する多くの問題。再配布のバンドルを忘れると、多くの問題が発生する可能性があります。

b-ロードおよびアンロードするDLLが多いと、起動および終了時間が遅くなります。

おそらく私が考えていない他の理由...

7。 「C/C++ Runtime Library」をプロジェクトに静的または動的にリンクする必要がありますか?

それは本当に依存しています。私は個人的に静的にリンクすることを好みます。私は正しいredist/dll /などを探し回るのが嫌いです。

20
thang