ビルドとコンパイルの違いはわかりません。彼らは同じですか?リンクは正確にどのように機能しますか? .soファイルと.oファイルには何が含まれており、どのように使用するのですか?私は毎日これらのファイルを見ていますが、実際にそのファイルが何を含んでいるのかわかりません。これらのプロセスを明確に説明するためにチュートリアルを提案できる人はいますか?
ベストアンサー1
「ビルド」という用語は、一般に、ソースコードファイルおよび他のリソースセットで始まり、実行可能ファイルセット、共有ライブラリ、およびその他のリソースで終わるプロセス全体を表すために使用される。これには、特殊なプリプロセッサ(Qtコードなど)、コードジェネレータ(または例)、コンパイル、リンク、および後処理ステップ(ビルドファイルまたは配布ファイルなど)など、いくつかの手順が
含まれます。moc
flex
yacc
bison
tar.gz
rpm
CおよびC ++(および関連言語)の場合、コンパイルは.c
ソースファイル(Cコードファイルなど)をオブジェクトファイル(.o
)に変換することです。これらのオブジェクトファイルには、そのソースコード用にコンパイラによって生成された機械語コードが含まれていますが、最終製品ではありません。特に、外部関数(およびデータ)参照は確認されません。この意味では、彼らは「不完全」です。
オブジェクトファイルは時々一緒にグループ化され、静的.a
ライブラリとも呼ばれるアーカイブ(ファイル)を形成します。これはそれらを一緒にグループ化する便利な方法です。
リンクは(通常複数の)オブジェクトファイル(.o
または.a
)と共有ライブラリを取り、オブジェクトファイルを結合し、(主に)オブジェクトファイル自体と共有ライブラリ間の参照を確認し、実際に使用できる実行可能ファイルまたは共有ライブラリを作成します。 (.so
)。他のプログラムや共有ライブラリで使用できます。
共有ライブラリは、他の実行可能ファイルで直接使用できるコード/関数のリポジトリです。共有ライブラリへの動的リンクとオブジェクトまたはアーカイブファイルの直接(静的)リンクの主な違いは、共有ライブラリを使用する実行可能ファイルを再構築せずに更新できることです(これには多くの制限があります)。
たとえば、ある時点でOpenSSL共有ライブラリでバグが見つかると、そのコードで修正が行われ、更新された共有ライブラリが構築およびリリースされる可能性があります。この共有ライブラリに動的にリンクされたプログラムは、エラーを修正するために再構築する必要はありません。共有ライブラリを更新すると、すべてのユーザーが自動的に変更されます。
代わりに、オブジェクトファイルにリンクされている場合(または通常静的にリンクされている場合)、再構築する必要があります(または少なくとも再接続)修正を得るには
実際の例:コマンドライン記録/編集サポートを備えた素晴らしいコマンドライン計算機であるCでプログラムを作成するとします。電卓コードを作成しますが、readline
入力処理にライブラリを使用します。
コードは、数学関数(対応する関数をに入れるmathfuncs.c
)と入力/出力を処理する「基本」電卓コード(に入れるmain.c
)の2つの部分に分けられます。
あなたの立てる含む:
Compile mathfuncs.c(「コンパイルのみ」を
gcc -o mathfuncs.o -c mathfuncs.c
表す)にはコンパイルされた数学関数が含まれていますが、「実行可能」ではありません。関数コードのリポジトリだけです。-c
mathfuncs.o
フロントエンド(
gcc -o main.o -c main.c
)をコンパイルすることも
main.o
関数の集合にすぎず、実行可能ではありません。電卓の実行可能ファイルを以下に関連付けます
readline
。gcc -o supercalc main.o mathfuncs.o -lreadline # ^ executable ^ dynamic link with libreadline.so # ^ ^ two .o files statically linked in
これで、ライブラリ
supercalc
に応じて実行できる実際の実行可能ファイル()が作成されました。readline
rpm
すべての実行可能ファイルと共有ライブラリ(およびヘッダファイル)を含むパッケージをビルドします。 (これらの.o
ファイルは最終製品ではなく一時的なビルド製品であり、通常は出荷されません。)
これにより、バグが見つかった場合は、readline
修正を得るために実行可能ファイルを再構築(および再公開)する必要がなくなりますlibreadline.so
。更新するだけです。ただし、ここでバグが見つかった場合は、mathfuncs.c
再コンパイルして再リンクする必要がありますsupercalc
(そして新しいバージョンをリリースする必要があります)。