コンパイルとリンク


前に書く
C言語のみを議論します.
「バイナリコード」とは、コンピュータが直接実行できるコード(オペレーティングシステム層のコマンドなのか、CPUのマシンコマンドなのかについては、ここでは詳しく説明しない)を指す.
ヘッダファイル
普通はhファイル.
ヘッダファイルの機能は、プログラマとコンパイラを示すことです.どの関数を呼び出すことができますか.これらの関数はどのように呼び出すべきですか(パラメータと戻り値)?
ヘッダファイルは、ライブラリの格納場所を示しません.必要なすべてのライブラリファイルは、デフォルトディレクトリまたは指定ディレクトリにある必要があります.
中間コードファイル
普通はoまたは.objファイル.
中間コードファイルは次のとおりです.
  • 一般文のバイナリ符号化.
  • ユーザ定義関数のバイナリ符号化およびインタフェース.
  • 関数呼び出しの指示(「リンク」または「ポインタ」と理解できる).
  • 中間コードファイルの使命はリンクが完了すると終了します.
    ライブラリ
    ライブラリはファイルです.
    ライブラリの内容は、ライブラリを形成する複数の中間コードファイルの内容の集合である.
    ライブラリと中間コードファイルのフォーマットが違います.
    静的ライブラリ
    Windowsでは「静的リンクライブラリ」と呼ばれています.
    静的ライブラリは本質的にライブラリです.Linuxでは一般的に.aファイル、Windowsでは.libファイル.
    複数の実行可能ファイルがリンク時に同じ静的ライブラリを使用していると仮定します.実際,静的ライブラリで生成されたバイナリ符号化は実行可能ファイルに格納される.これらの実行可能ファイルが実行されると、実行可能ファイルが生成するプロセスごとに、メモリに上記のバイナリ符号化のコピーが1部ずつ存在する.
    静的リンクライブラリの使命は、リンクが完了すると終了します.
    同じ実行可能ファイルで生成されたプロセスは、メモリにコードセグメントを共有します.これはLinuxオペレーティングシステムのメモリ管理の特性で、静的ライブラリとは関係ありません.
    共有ライブラリ
    Windowsでは「ダイナミックリンクライブラリ」と呼ばれています.
    共有ライブラリは本質的にライブラリです.Linuxでは一般的に.soファイル、Windowsでは.dllファイル.
    複数の実行可能ファイルがリンク時に同じ共有ライブラリを使用していると仮定します.実際には、共有ライブラリは実行可能ファイルに参照され、そのバイナリ符号化は実行可能ファイルに格納されていない.これらの実行可能ファイルが実行されると、異なる実行可能ファイルで使用される共有ライブラリによって生成された同じバイナリ符号化は、メモリに1つのコピーしかありません.このコピーは、実行可能なすべてのファイルのすべてのプロセスによって共有されます.
    静的ライブラリと共有ライブラリのフォーマットは異なり、両者のサイズは比較できません.
    コンパイルとリンク
    コンパイル
    ≪プロシージャ|Procedure|emdw≫:ソース・ファイルから中間コード・ファイルを生成します.
    コマンド:gccオプション:-c静的ライブラリのパッケージング
    ≪プロシージャ|Procedure|emdw≫:静的ライブラリを中間コードファイルで生成します.
    コマンド:arオプション:-r共有ライブラリのパッケージング
    プロシージャ:中間コードファイルで共有ライブラリを生成します.
    コマンド:gccオプション:-shared -fPIC注意:
  • 中間コードファイルのコンパイル時と共有ライブラリのパッケージング時に、上記のオプションを追加する必要があります.梱包中にエラーが発生します.
  • -fPICを付けなければ「偽共有ライブラリ」が生成される.疑似共有ライブラリは、実行可能ファイルには入れられず、複数の参照された実行可能ファイルによって共有されません.

  • 静的リンク
    プロシージャ:実行可能ファイルを中間コードファイルと静的ライブラリ(なし)で生成します.
    結果:実行可能ファイルには、呼び出されたシステム関数のバイナリコードを含む実行に必要なすべてのバイナリコードが含まれます.実行可能ファイルは一般的に独立して実行できます.
    コマンド:gccオプション:-staticダイナミックリンク
    プロシージャ:中間コードファイル、静的ライブラリ(なし)、共有ライブラリ(なし)で実行可能ファイルを生成します.
    結果:
  • 実行可能ファイルは、中間コードファイルと静的ライブラリ内のバイナリコードを含み、これらのバイナリコードは、a.基本文に由来する.b.カスタム関数の実装.
  • 実行可能ファイルは、リンク時に使用される共有ライブラリ(すべての階層、すべて)に依存します.
  • 実行可能ファイルは、一般に独立して実行できません.

  • コマンド:gccオプション:なし
    その他
    静的コンパイル=コンパイル+静的リンク
    ダイナミックコンパイル=コンパイル+ダイナミックリンク
    lddコマンドを使用して、実行可能ファイルに依存する共有ライブラリを表示できます.
    gccコマンドのその他の一般的なオプション:
  • -Wl,-rpath,./:実行可能ファイルの実行時に、そのディレクトリを共有ライブラリの検索範囲に追加します.
  • -include:ヘッダファイルを検索し、コンパイルに参加します.
  • -I(大文字i):ディレクトリのすべてのヘッダファイルをコンパイルに追加します.
  • -l(小文字のL):ライブラリを検索してコンパイルに参加します(ライブラリの略語に続く).
  • -L:ディレクトリをライブラリの検索範囲に追加します.-Lをgccコマンドの最後に置く必要があります.そうしないと、エラーが発生することがあります.

  • GCCは自動的にヘッダファイルとライブラリをコンパイルとリンクに追加します.
  • ヘッダファイルのデフォルト検索ディレクトリ:現在のディレクトリ、/include//usr/include/
  • ライブラリのデフォルトの検索ディレクトリ:現在のディレクトリ、/lib//usr/lib/