Cランタイムライブラリとは何ですか?


157

実際にはCランタイムライブラリとは何ですか?私は悪魔のようにグーグルで検索していましたが、Microsoftよりも優れたものはありませんでした。「Microsoftランタイムライブラリは、Microsoft Windowsオペレーティングシステム用のプログラミングルーチンを提供します。これらのルーチンは、 CおよびC ++言語。」

わかりました。でも、たとえば、何が入っているのlibcmt.libですか?それは何をするためのものか?C標準ライブラリはCコンパイラの一部だと思いました。それでは、libcmt.libWindowsのC標準ライブラリ関数の実装は、win32で動作しますか?

回答:


71

はい、libcmtは、Microsoftのコンパイラで提供されるC標準ライブラリの(いくつかの1つ)実装です。これらは、3つの基本的なタイプのライブラリの「デバッグ」バージョンと「リリース」バージョンの両方を提供します。シングルスレッド(常に静的にリンク)、マルチスレッドの静的にリンク、およびマルチスレッドの動的にリンク(ただし、使用しているコンパイラのバージョンによって異なります)使用して、それらのいくつかは存在しない場合があります)。

したがって、「libcmt」という名前の中で、「libc」は(多かれ少なかれ)Cライブラリの従来の名前です。「mt」は「マルチスレッド」を意味します。「デバッグ」バージョンでは、最後に「d」が追加され、「libcmtd」が提供されます。

含まれている関数に関しては、C標準(パート7、偶然気になっている場合)は、準拠(ホストされた)実装が提供する必要がある関数のセットを定義しています。ほとんどのベンダー(Microsoftを含む)は、他にもさまざまな関数を追加しています(互換性のために、標準関数が対処しない機能を提供するためなど)。ほとんどの場合、コンパイラーが使用する「内部」関数もかなり含まれています。ただし、通常はエンドユーザーは行いません。

(例を使用するために)「libcmt」の関数の完全なリストを取得したい場合は、Visual Studioコマンドプロンプト(通常は「Visual Studio Tools」の下)の1つを開き、ライブラリがあるディレクトリに切り替えます。インストールし、次のように入力すると、そのライブラリ内のすべてのオブジェクトファイルの名前のlib -list libcmt.lib長い)リストが生成されます。これらは常に関数の名前に直接対応しているわけではありませんが、一般的にはわかります。特定のオブジェクトファイルを確認する場合は、を使用lib -extractしてそれらのオブジェクトファイルの1つを抽出し、を使用dumpbin /symbols <object file name>して、その特定のオブジェクトファイル内にある関数を検索できます。


37
「Cランタイムライブラリ」とは何ですか?
onmyway133 14

4
@entropy:確かに私と同じように見えますが、簡単な答えは、関数のコレクションであり、その多く(必ずしもすべてではない)がC標準のパート7で指定されているということです。
Jerry Coffin 2014

3
この答えは、Cライブラリがコンパイラツールチェーンの一部にすぎないことを意味します。正確ではない。
jiggunjer 2017

@JerryCoffin質問:strcpyたとえば、C標準ライブラリの関数は、ランタイムライブラリに実装されているのでしょうか、それとも通常の.cファイルにコードが含まれているのでしょうか。
掲示板

@forumulator:通常、適切な標準ライブラリ(..dll、lib、.a、.so、または使用しているシステムに適用されるもの)を生成するためにコンパイルされる.cファイルにソースコードがあります。 。
Jerry Coffin 2017

55

最初に、ランタイムライブラリとは何かを理解する必要があります。「Microsoft Cランタイムライブラリ」とはどういう意味か考えてください。

参照:http : //en.wikipedia.org/wiki/Runtime_library

更新される可能性があるため、ほとんどの記事をここに投稿しました。

コンピュータープログラムのソースコードがコンパイラーによってそれぞれのターゲット言語に変換されるとき、プログラム内の各コマンドと組み込み関数へのすべての呼び出しによってインプレース生成が行われると、プログラムコードが極端に大きくなります。毎回ターゲット言語での完全なそれぞれのプログラムコードの。代わりに、コンパイラーはランタイム・ライブラリー内のコンパイラー固有の補助関数を使用することが多く、アプリケーション・プログラマーはほとんどアクセスできません。コンパイラーの製造元によっては、ランタイム・ライブラリーに、それぞれのコンパイラーの標準ライブラリーが含まれている場合や、その中に含まれている場合があります。

また、実行時にのみ実行できる(またはより効率的または正確な)いくつかの関数は、ランタイムライブラリに実装されています。このため、高度なコンパイル時チェックとリリース前のテストにもかかわらず、プログラムが実際のデータを含む「ライブ」環境でテストされるまで、一部のプログラミングバグは発見されません。この場合、エンドユーザーはランタイムエラーメッセージを受け取ることがあります。

通常、ランタイムライブラリはオペレーティングシステムにアクセスすることで多くの機能を実現します。多くのプログラミング言語には組み込み関数があり、必ずしもコンパイラで実現する必要はありませんが、ランタイムライブラリに実装できます。したがって、ランタイムライブラリと標準ライブラリの境界はコンパイラの製造元次第です。したがって、ランタイムライブラリは常にコンパイラ固有およびプラットフォーム固有です。

ランタイムライブラリの概念を、アプリケーションプログラマーが作成したり、サードパーティが提供したり、実行時にリンクされるプログラムライブラリを意味する通常のプログラムライブラリと混同しないでください。たとえば、プログラミング言語Cは最小限のランタイムライブラリ(一般にcrt0と呼ばれます)のみを必要としますが、各実装が提供する必要のある大きな標準ライブラリ(C標準ライブラリと呼ばれます)を定義します。


3
標準ライブラリと区別する方法として強調表示された文は、「ほ​​とんど」または「ときどき」で修飾されていない、私が見た最初の簡潔で正確な答えです。
nik.shornikov

@ nik.shornikov:これは、他の説明がより正確になるようにするためです。通常、標準ライブラリはコンパイラとプラットフォームに固有のものですが、常にそうであるとは限りません。たとえば、MingwとIntelのWindows用C ++コンパイラの少なくともいくつかのバージョンでは、独自のライブラリを提供するのではなく、Microsoftの標準ライブラリを使用しています。同様に、LinuxのClangは、gccの既存のインストールで標準ライブラリを使用するためにインストールすることができます(多くの場合、インストールされています)。
Jerry Coffin

私は、POSIXをサポートする任意のプラットフォームに移植可能なCおよびC ++標準ライブラリーの両方の実装を作成することが可能であると合理的に確信しています。
Jerry Coffin

20

私はこれを自分で尋ねただけで、数時間脳を痛めていました。それでも、本当に意味のあることは何も見つかりませんでした。トピックに何かを書く人は皆、実際に「教える」ことはできません。誰かに教える場合は、その人が理解できる最も基本的な言語を使用するので、トピックを処理するときに他のトピックを気にする必要はありません。だから私は、このすべての混乱にうまく適合しているように思える自分のための結論に達しました。

プログラミング言語Cでは、すべてのプログラムはmain()関数で始まります。他の言語は、プログラムが開始する他の関数を定義する場合があります。しかし、プロセッサーはmain()を知りません。プロセッサは、「0」と「1」の組み合わせで表される事前定義されたコマンドのみを認識します。

基盤となるオペレーティングシステム(Microsoft Windows、Linux、MacOSなど)を持たないマイクロプロセッサプログラミングでは、内部で反復およびジャンプ(ループ、関数呼び出し)するProgrammCounter(PC)を設定して、どこから開始するかを明示的にプロセッサに指示する必要があります。プロセッサが認識しているコマンド。RAMの大きさ、プログラムスタック(ローカル変数)の位置、およびヒープ(動的変数)の位置とグローバル変数の位置(SSAと呼ばれていたと思われます)を設定する必要があります。 ?)RAM内。単一のプロセッサは、一度に1つのプログラムしか実行できません。

それがオペレーティングシステムの出番です。オペレーティングシステム自体は、プロセッサ上で実行されるプログラムです。カスタムコードの実行を可能にするプログラム。プログラムの実行コード(RAMにロードされている)を切り替えることにより、一度に複数のプログラムを実行します。しかし、オペレーティングシステムはプログラムであり、各プログラムは異なる方法で記述されています。カスタムプログラムのコードをRAMに置くだけでは実行されず、オペレーティングシステムはそれを認識しません。プログラムを登録するオペレーティングシステムの関数を呼び出し、プログラムに必要なメモリ量をオペレーティングシステムに知らせ、プログラムへのエントリポイントを配置する必要があります(Cの場合はmain()関数)。そしてこれは、RuntimeLibrary内にあると私が思うものであり、各オペレーティングシステムに特別なライブラリが必要な理由を説明しています。

これは、RUNTIMELibraryと呼ばれていても、.dllファイルのように実行時に動的にリンクされない理由も説明しています。RuntimeLibraryは静的にリンクする必要があります。プログラムの起動時に必要になるためです。RuntimeLibraryは、RUNTIMEにカスタムプログラムを別のプログラム(オペレーティングシステム)に挿入/接続します。これは本当に脳の一部を引き起こします...

結論:RUNTIMELibraryは命名に失敗しました。初期には.dll(実行時のリンク)がなく、違いを理解するという問題は単に存在しなかった可能性があります。しかし、これが本当であっても、その名前はひどく選ばれています。

RuntimeLibraryのより適切な名前は、StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibraryです。

修正/拡張の応援のために、私が正しく理解できたことを願っています。


1
私はまだアイデアを取得しません。なぜプログラムは実行時に何かを必要とするのですか?バイナリコードが、実行時にそれをサポートするものがなければ、100%だけで実行できないのはなぜですか?または言い換えると、何もせずに(OSを含めて)100%実行するコードを作成することは可能ですか?
MarcioAB 2017年

5
理論的には、プログラムはRTLを必要としません。しかし、オペレーティングシステムからの協力なしに、プログラムが結果を表示したり、入力を受け取ったり、メモリを要求したりする方法はありますか?
SN

16

Cは言語であり、その定義では、利用できる関数は必要ありません。IO、数学ルーチンなどはありません。慣例として、実行可能ファイルにリンクできる一連のルーチンが用意されていますが、それらを使用する必要ありません。ただし、これは、ほとんどのリンカがCランタイムライブラリへのリンクを要求しないようにするための非常に一般的なことです。

たとえば、組み込みシステムでの作業では、mallocを使用することが実際的でない場合があります。以前はPostScriptをプリンターに埋め込むことに取り組んでいましたが、組み込みシステムでははるかに満足できる独自のランタイムライブラリセットがあったため、「標準」を気にする必要はありませんでした。


11
実際、C標準は、「独立型」と「ホスト型」の2種類のC環境を記述しており、ホスト型環境では、標準に記述されている機能利用可能であると定義されています。組み込みシステムでは、C環境は通常独立しているため、ライブラリルーチンがない場合や、一部を使用せずに独自の置換を使用できる場合があります。

10

ランタイムライブラリは、実行するCプログラム用に自動的にコンパイルされるライブラリです。使用するライブラリのバージョンは、コンパイラ、プラットフォーム、デバッグオプション、およびマルチスレッドオプションによって異なります。

ランタイムライブラリのさまざまな選択肢の適切な説明:http : //www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

これには、ライブラリを呼び出す必要があると通常は考えられない関数が含まれています。

  • malloc
  • 列挙型、構造体
  • 腹筋、分
  • 主張する

マイクロソフトには、ランタイムライブラリ関数の優れたリストがあります。

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

関数の正確なリストはコンパイラによって異なるため、iOSの場合は、dispatch_async()やNSLog()などの他の関数を取得します。


1
構造体と列挙型は本当にランタイムライブラリですか?
ディーンP

6

CまたはC ++からコンパイルされた実行可能ファイルに対してDependency Walkerなどのツールを使用すると、依存するDLLの1つがMSVCRT.DLLであることがわかります。これは、Microsoft Cランタイムライブラリです。DWを使用してMSVCRT.DLLをさらに調べると、printf()、puts(0、gets()、atoi()などのすべての関数が存在する場所であることがわかります。


6
その実行可能ファイルのコンパイル中に、Cランタイムが動的にリンクされた場合のみ。静的にリンクされた場合、Dependency Walkerはnothiingを示します
Eli Bendersky

4

私はマイクロソフトの定義が本当に意味すると思います:

Microsoftの標準Cランタイムライブラリの実装では、...


3

Win32 SDKで提供されるCランタイムライブラリには3つの形式があります。

* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. 

Microsoft Visual C ++ 32ビット版にもこれら3つの形式が含まれていますが、DLLのCRTはMSVCRT.LIBという名前です。DLLは再配布可能です。その名前は、VC ++のバージョン(つまり、MSVCRT10.DLLまたはMSVCRT20.DLL)によって異なります。ただし、MSVCRT10.DLLはWin32sではサポートされておらず、CRTDLL.LIBはWin32sでサポートされています。MSVCRT20.DLLには、Windows NT用とWin32s用の2つのバージョンがあります。

参照:http : //support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.