web-dev-qa-db-ja.com

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

実際にCランタイムライブラリとは何ですか?私は悪魔のようにグーグルを探していましたが、Microsoftのものよりも良いものを見つけることができませんでした。 CおよびC++言語。」

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

144

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

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

それに含まれる機能に関しては、C標準(第7部)では、準拠(ホスト)実装が提供しなければならない一連の機能を定義しています。ほとんどのベンダー(Microsoftを含む)は、他のさまざまな機能自体を追加します(互換性のため、標準機能では対応できない機能を提供するためなど)。ほとんどの場合、コンパイラが使用する「内部」機能も多数含まれます。しかし、通常はエンドユーザーによってではありません。

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

63
Jerry Coffin

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

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

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

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

また、実行時にのみ実行できる(またはより効率的または正確な)一部の機能は、実行時ライブラリに実装されます。いくつかの論理エラー、配列境界チェック、動的型チェック、例外処理、および場合によってはデバッグ機能。このため、洗練されたコンパイル時のチェックとリリース前のテストにもかかわらず、実際のデータを使用して「ライブ」環境でプログラムをテストするまで、一部のプログラミングのバグは発見されません。この場合、エンドユーザーにランタイムエラーメッセージが表示される場合があります。

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

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

50
fantagons

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

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

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

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

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

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

RuntimeLibraryのより良い名前は、StartupLibrary/OSEntryLibrary/SystemConnectLibrary/OSConnectLibraryです。

訂正/拡張の歓声のために、私がそれを正しくしたことを願っています。

16
Rumble

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

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

14
plinth

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

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

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

  • malloc
  • 列挙型、構造体
  • 腹筋、分
  • アサート

Microsoftには、ランタイムライブラリ関数の素晴らしいリストがあります。

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

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

9
arinmorf

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

6
anon

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

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

4
Andrey

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

1
Michael

だから...私は理解していませんでした... Cランタイムライブラリは標準Cライブラリですか? Microsoft Cランタイムライブラリには、すべての(ANSI?)標準Cライブラリの実装と、標準ライブラリを拡張するMicrosoftの特定の機能が含まれていると思います。

0
nonlinearly