コンパイル/リンクプロセスはどのように機能しますか?

トニー・ザ・ライオン

コンパイルとリンクのプロセスはどのように機能しますか?

(注:これは、StackOverflowのC ++ FAQへのエントリを意味します。このフォームでFAQを提供するというアイデアを批評したい場合は、これをすべて開始したメタへの投稿がそのための場所になります。その質問は、FAQのアイデアが最初に始まっC ++チャットルーム監視されているため、アイデアを思いついた人があなたの答えを読む可能性が非常に高くなります。)

R.マルティニョフェルナンデス

C ++プログラムのコンパイルには、次の3つのステップが含まれます。

  1. 前処理:プリプロセッサはC ++ソースコードファイルを受け取り、#includes、#defines、およびその他のプリプロセッサディレクティブを処理します。このステップの出力は、プリプロセッサディレクティブのない「純粋な」C ++ファイルです。

  2. コンパイル:コンパイラはプリプロセッサの出力を受け取り、そこからオブジェクトファイルを生成します。

  3. リンク:リンカは、コンパイラによって生成されたオブジェクトファイルを取得し、ライブラリまたは実行可能ファイルのいずれかを生成します。

前処理

プリプロセッサは、およびのようなプリプロセッサディレクティブを処理しますこれはC ++の構文に依存しないため、注意して使用する必要があります。#include#define

#includeディレクティブをそれぞれのファイルのコンテンツ(通常は単なる宣言)に置き換え、マクロ(#defineを置き換え#if#ifdefおよび#ifndefディレクティブに応じてテキストの異なる部分を選択することにより、一度に1つのC ++ソースファイルで機能します

プリプロセッサは、前処理トークンのストリームで機能します。マクロ置換は、トークンを他のトークンに置き換えることとして定義され##ます(オペレーターは、意味がある場合に2つのトークンをマージできるようにします)。

このすべての後、プリプロセッサは、上記の変換の結果として生じるトークンのストリームである単一の出力を生成します。また、各行がどこから来たのかをコンパイラーに通知するいくつかの特別なマーカーを追加して、それらを使用して適切なエラーメッセージを生成できるようにします。

#ifおよび#errorディレクティブを巧妙に使用すると、この段階でいくつかのエラーが発生する可能性があります。

コンパイル

コンパイルステップは、プリプロセッサの各出力で実行されます。コンパイラは、純粋なC ++ソースコード(現在はプリプロセッサディレクティブなし)を解析し、それをアセンブリコードに変換します。次に、基盤となるバックエンド(ツールチェーンのアセンブラー)を呼び出して、そのコードをマシンコードにアセンブルし、実際のバイナリファイルを何らかの形式(ELF、COFF、a.out、...)で生成します。このオブジェクトファイルには、入力で定義されたシンボルのコンパイル済みコード(バイナリ形式)が含まれています。オブジェクトファイル内のシンボルは名前で参照されます。

オブジェクトファイルは、定義されていないシンボルを参照できます。これは、宣言を使用し、その定義を提供しない場合に当てはまります。コンパイラはこれを気にせず、ソースコードが整形式である限り、オブジェクトファイルを問題なく生成します。

コンパイラーでは通常、この時点でコンパイルを停止できます。これを使用すると、各ソースコードファイルを個別にコンパイルできるため、これは非常に便利です。これが提供する利点は、1つのファイルのみを変更する場合に、すべてを再コンパイルする必要がないことです。

生成されたオブジェクトファイルは、後で簡単に再利用できるように、静的ライブラリと呼ばれる特別なアーカイブに入れることができます。

構文エラーや失敗したオーバーロード解決エラーなどの「通常の」コンパイラエラーが報告されるのは、この段階です。

リンク

リンカは、コンパイラが生成したオブジェクトファイルから最終的なコンパイル出力を生成するものです。この出力は、共有(または動的)ライブラリ(名前は似ていますが、前述の静的ライブラリとの共通点はあまりありません)または実行可能ファイルのいずれかです。

未定義のシンボルへの参照を正しいアドレスに置き換えることにより、すべてのオブジェクトファイルをリンクします。これらの各シンボルは、他のオブジェクトファイルまたはライブラリで定義できます。標準ライブラリ以外のライブラリで定義されている場合は、リンカに通知する必要があります。

この段階で最も一般的なエラーは、定義の欠落または定義の重複です。前者は、定義が存在しない(つまり、定義が書き込まれていない)か、定義が存在するオブジェクトファイルまたはライブラリがリンカーに渡されなかったことを意味します。後者は明らかです。同じシンボルが2つの異なるオブジェクトファイルまたはライブラリで定義されています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

gulp-typescriptインクリメンタルコンパイルはどのように機能しますか?

分類Dev

VSインテリセンスは、コンパイル時に匿名クラスが持つプロパティをどのように認識しますか?

分類Dev

チェックポイント復元プロセスはどのように機能しますか?

分類Dev

xlxs.js「l」セルのハイパーリンクオブジェクトオプションはどのように機能しますか

分類Dev

Fody NuGetパッケージは、コンパイルプロセスの最後にアセンブリをどのようにマージしますか?

分類Dev

サイクリプト/基板はどのように機能してプロセスに接続しますか?

分類Dev

ビットコインのロック/ロック解除スクリプトはどのように機能しますか?

分類Dev

KubernetesのDockerコンテナ内のメモリマップファイルは、Linuxの通常のプロセスと同じように機能しますか?

分類Dev

xkbコンパイルはどのように機能しますか?

分類Dev

Android、ループはどのように機能しますか?(コトリン)

分類Dev

リンカーはどのように正確に機能しますか(マイクロコントローラーのコンテキスト)?

分類Dev

スキムリンクスコープとは何ですか?どのように機能しますか

分類Dev

スキムリンクスコープとは何ですか?どのように機能しますか

分類Dev

Cassandraでセカンダリインデックスはどのように機能しますか?

分類Dev

Objective-Cのインポートプロセスはどのように機能しますか?

分類Dev

bashコプロセスはどのようにしてパイプライン化を実現しますか?

分類Dev

ブラウザはWebAssemblyでコンパイルされたコードからプロセスメモリをどのように保護しますか?

分類Dev

クリティカルセクションを保護するためのプログラムで「ロック」はどのように機能しますか?

分類Dev

グラフィックスパイプラインはどのように機能しますか?

分類Dev

Kmeansクラスタリングはテンソルフローでどのように機能しますか?

分類Dev

Pythonファイルは、コマンドラインオプションとパイプ機能を備えたモジュールとスクリプトの両方になるようにどのように作成する必要がありますか?

分類Dev

そのスクリプトjqueryはコンテンツアップロードgromajaxに対してどのように機能しますか?

分類Dev

パンダはインデックスごとにデータフレームをプロットしますが、どのように機能しますか?

分類Dev

インクリメント演算子はループ内でどのように機能しますか

分類Dev

インクリメンターはCMDForループでどのように機能しますか?

分類Dev

オールインワン(Edge / Firefox / Chrome)ブラウザ拡張機能のコンテンツスクリプトにメッセージパッシングコールバックを実装するにはどうすればよいですか?

分類Dev

プロパティアクセスはどのように機能し、次の行は何をしますか?

分類Dev

ファイルシステムコネクタシンクはどのように機能しますか

分類Dev

Zenityプログレスダイアログのキャンセルボタンはどのように機能しますか?

Related 関連記事

  1. 1

    gulp-typescriptインクリメンタルコンパイルはどのように機能しますか?

  2. 2

    VSインテリセンスは、コンパイル時に匿名クラスが持つプロパティをどのように認識しますか?

  3. 3

    チェックポイント復元プロセスはどのように機能しますか?

  4. 4

    xlxs.js「l」セルのハイパーリンクオブジェクトオプションはどのように機能しますか

  5. 5

    Fody NuGetパッケージは、コンパイルプロセスの最後にアセンブリをどのようにマージしますか?

  6. 6

    サイクリプト/基板はどのように機能してプロセスに接続しますか?

  7. 7

    ビットコインのロック/ロック解除スクリプトはどのように機能しますか?

  8. 8

    KubernetesのDockerコンテナ内のメモリマップファイルは、Linuxの通常のプロセスと同じように機能しますか?

  9. 9

    xkbコンパイルはどのように機能しますか?

  10. 10

    Android、ループはどのように機能しますか?(コトリン)

  11. 11

    リンカーはどのように正確に機能しますか(マイクロコントローラーのコンテキスト)?

  12. 12

    スキムリンクスコープとは何ですか?どのように機能しますか

  13. 13

    スキムリンクスコープとは何ですか?どのように機能しますか

  14. 14

    Cassandraでセカンダリインデックスはどのように機能しますか?

  15. 15

    Objective-Cのインポートプロセスはどのように機能しますか?

  16. 16

    bashコプロセスはどのようにしてパイプライン化を実現しますか?

  17. 17

    ブラウザはWebAssemblyでコンパイルされたコードからプロセスメモリをどのように保護しますか?

  18. 18

    クリティカルセクションを保護するためのプログラムで「ロック」はどのように機能しますか?

  19. 19

    グラフィックスパイプラインはどのように機能しますか?

  20. 20

    Kmeansクラスタリングはテンソルフローでどのように機能しますか?

  21. 21

    Pythonファイルは、コマンドラインオプションとパイプ機能を備えたモジュールとスクリプトの両方になるようにどのように作成する必要がありますか?

  22. 22

    そのスクリプトjqueryはコンテンツアップロードgromajaxに対してどのように機能しますか?

  23. 23

    パンダはインデックスごとにデータフレームをプロットしますが、どのように機能しますか?

  24. 24

    インクリメント演算子はループ内でどのように機能しますか

  25. 25

    インクリメンターはCMDForループでどのように機能しますか?

  26. 26

    オールインワン(Edge / Firefox / Chrome)ブラウザ拡張機能のコンテンツスクリプトにメッセージパッシングコールバックを実装するにはどうすればよいですか?

  27. 27

    プロパティアクセスはどのように機能し、次の行は何をしますか?

  28. 28

    ファイルシステムコネクタシンクはどのように機能しますか

  29. 29

    Zenityプログレスダイアログのキャンセルボタンはどのように機能しますか?

ホットタグ

アーカイブ