48

私は Microsoft Visual Studio ユーザーです。「C/C++ ランタイム ライブラリ」について質問です。

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

#include <iostream>

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

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

  1. 「C/C++ ランタイム ライブラリ」と「C/C++ 標準ライブラリ」に違いはありますか?

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

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

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

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

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

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

4

2 に答える 2

64

「C/C++ ランタイム ライブラリ」という用語には意味がありません。大まかにいえば、IDE のプロジェクト設定の名前です。プロジェクト + プロパティ、C/C++、コード生成、ランタイム ライブラリの設定。/MD と /MT のどちらかを選択できます。

既定の設定である /MD を使用すると、プログラムはランタイム ライブラリの DLL バージョンを使用します。お使いのマシンでは、Visual Studio インストーラーによって c:\windows\system32 または c:\windows\syswow64 にコピーされています。VS インストール ディレクトリの vc/redist サブディレクトリにそれらのコピーがあり、プログラムのインストーラを作成するときに使用できます。それらの 3 つのバージョン、32 ビット Intel プロセッサ用の x86、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 を使用する場合は、大きくなることもあります。

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

プログラムは Windows Vista、7、および 8 で実行されます。XP のサポートは終了しています。XP で引き続き実行されるプログラムを作成するには、VS Update 1 が必要であり、プロジェクトのツールセット設定を「v110」から「v110_xp」に変更する必要があります。 . これを行うと、ロケールおよびスレッド ローカル ストレージに関連する一部の機能が失われるため、テストが必要です。

于 2013-02-07T13:33:33.930 に答える
22

ここでは何も起こりません...間違いを見つけたら、チャイムを鳴らしてください。

1. 「C/C++ ランタイム ライブラリ」と「C/C++ 標準ライブラリ」に違いはありますか?

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

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

2. 「C/C++ ランタイム ライブラリ」ライブラリがプロジェクトに静的にリンクされているか、動的にリンクされているかはどうすればわかりますか?

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

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

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

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

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

依存ツールを使用して、どれが使用されているかを把握できます。 http://www.dependencywalker.com/

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

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

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

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

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

dll を使用する理由:

a - サイズ。ユーザーのシステムに既にインストールされているはずのすべてのライブラリーが dll に含まれているため、exe のサイズが小さくなりますが、そうでない場合もあります。

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

dll を使用しない理由:

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

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

思いもよらない別の理由があったのかもしれません…

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

それは本当に依存します。個人的には静的リンクの方が好きです。私は、適切な redist/dll/etc を探し回るのが嫌いです。

于 2013-02-07T11:59:04.213 に答える