created: 2020-08-07T07:39:09.000Z

C++のビルドステップと静的/動的ライブラリについて

ビルドのステップ

  • プリプロセッサ
    • #include の処理
    • #ifdef とかの処理
  • コンパイラ
    • ソースファイルひとつからアセンブリファイルひとつを生成する
    • #include された関数などは、ヘッダファイルのみ使う
      • 実装はここでは読み込まない
  • アセンブラ
    • アセンブリファイルからオブジェクトファイルを生成
    • ここでCPUのアーキテクチャごとのファイルが生成される
  • リンカ
    • ヘッダファイルのみで、実装を参照してなかったところを埋める
    • main 関数があるファイルから、呼び出されてる実装を 再帰的に読み込みながらオブジェクトファイルを生成する

ライブラリの静的/動的

ライブラリの読み込み方は動的と静的と二種類がある

静的

静的にライブラリを読み込むと出力されるオブジェクトファイルに ライブラリファイルの実装が含まれたものができる

静的にライブラリを参照する場合は、ビルド時にgccのオプションでパスを指定する必要がある

  • ヘッダファイルのパス
  • ライブラリファイル(バイナリ)へのパス
  • ライブラリの名前

動的

動的に読み込むライブラリは実行時にライブラリファイルを読み込む

#include はコード内に登場するが、実装はコンパイル結果に含まれず ライブラリファイルのパス情報を持ったオブジェクトファイルが生成される

この方法だと実行ファイルにはライブラリのヘッダ情報しか含まれていないため、 ライブラリファイルを更新(実装を変更)しても実行ファイルの再コンパイルをしないですむ

参考

丁寧に説明されていてわかりやすかった

メモっておきたいのはビルドのステップと、ライブラリの静的/動的について