-
C言語のコンパイルプロセス
-
gccを-Eのhello.c -o hello.i 1.前処理
-
gccの-S hello.i -o hello.s 2.编译
-
gccの-c hello.s -o hello.o 3.汇编
-
gccのhello.o -o hello.elf 4.链接
-
-
プリコンパイル済み
-
ヘッドスタートで.Cファイル、マクロ展開
-
結果のファイルがファイルである.I
-
-
コンパイル
-
前処理.iファイルのアセンブラファイルには、.Sを生成した後、
-
-
編集
-
.Sアセンブリファイル、オブジェクトファイルを生成するための.o
-
-
リンク
-
オブジェクト・ファイルへのリンク.oファイル
-
-
含める
-
#include <> //システムで指定されたパスを見つけるために、角括弧、ヘッダファイル内のファイルを含みます
-
#include「」//、ヘッダファイルをインクルードするために二重引用符を使用して、現在のディレクトリにあるヘッダファイルのための初見、見つけることができませんし、その後ロードキングで指定されたシステムを見つけます。
-
注意:含めることが多い.Cファイルを含めることができますヘッダファイルをインクルードするために使用されていますが、.Cが含まれていません。
-
含まれるファイルがプリコンパイルされたが.Cは何度も、何度かを含め展開されている場合、展開することが含まれているため、重複する関数の定義につながるので、私たちは、.cファイルが含まれていません。
-
注意:だけのような前処理操作が含ま前処理され、構文チェックは、この段階では保存されません文法エラー、構文チェックの前にコンパイル段階の第二段階がありません。
-
-
定義
-
定義する定義使用してマクロを定義します
-
パラメータなしでマクロ
-
#define PI 3.14 PI名は通常、大文字であります
-
そして、プリコンパイル時のコードがPIに表示された場合は3.14を置き換えるために使用します。
-
メリットマクロ:限り、マクロを変更するなどして、残りの時間は、再プリコンパイルされます交換
-
注:マクロ定義の後ろにセミコロンを追加しないでください。
-
このドキュメントの最後に場所から定義されたマクロ定義の役割、
-
あなたは、マクロの途中で停止する場合は定義されています
-
#undefのPIは// PIの役割を終了します
-
-
-
パラメータ化されたマクロ
-
#define S(a、b)は、* bは、(自分自身を設定する場合があります)
-
型名ではないパラメータ化マクロとパラメータbを注意してください
-
将来的に置き換えS(2,4)、次に、パラメータに別の引数文字列を前処理し、他の予約文字、2 * 4
-
使い方
-
{int型のmain()
-
int型NUM;
-
確実= S(2.4)。// NUM = 2 * 4。
-
NUM = S(2 + 3,5)// NUM = * 5 2 + 3(2 + 3)あるいは代替的に図5b
-
}
-
-
-
-
パラメータ化されたマクロと関数パラメータとの差
-
パラメータ化されたマクロは、コードの実行プロセスは、関数呼び出しでない場合、あなたはポップをプッシュする必要はありません、何度も展開されます何度も呼ばれています。だから、マクロパラメータを取る彼らは時間を節約し、何度も拡大したため、スペースの無駄です
-
パラメータ化された機能コードだけで、プッシュが呼び出されたコードセグメントをフェッチするために呼び出されたときに、コードセグメントを,,ポップ有します。呼ばれるプロセスがあります
-
だから、参照機能で時間の無駄である、スペースを節約
-
関数パラメータとパラメータはありません参照マクロ仮パラメータタイプ名で入力され
-
-
選択コンパイル
-
AAAの#ifdef
-
コードセグメント
-
#else
-
2つのコード・セグメント
-
#endifの
-
我々はトップAAA IFDEF電流.Cを定義した場合、セグメント上でコードをコンパイル、またはコードセクション2をコンパイル
-
else文は、コンパイル済みの選択的条件によって実行される、選択的にコンパイルされた場合の違いに注意してelseステートメント場合は、唯一のコードはコンパイルされ???
-
2
-
AAA #ifndefのあなたは、このコードでマクロステートメント、または実行中のコード2を定義しない場合
-
コードセグメント
-
#else
-
2つのコード・セグメント
-
#endifの
-
そして、第1の相補
-
この方法は、多くの場合、さらにヘッダファイルが重複して含まれていないようにするために使用されます
-
使い方
-
#ifndefの_def _時間_
-
#define _def _時間_
-
ブロック
-
これは、重複したヘッダを防ぎ#endifの
-
-
3
-
表現の#if
-
ブロック
-
#else
-
ブロック2
-
#endifの
-
式が真である場合に、コードの最初の部分は、コンパイル、またはコードの第2段落をコンパイル
-
選択コンパイルが舞台やって物事をプリコンパイルされています
-
-
-
静的および動的ライブラリ
-
動的コンパイル
-
ダイナミックコンパイラは、動的ライブラリファイルをコンパイルするために使用されます
-
GCCのhello.c -oハロー
-
私たちは、デフォルトの動的コンパイル方法を使用しています
-
-
静的にコンパイル
-
静的にコンパイルをコンパイルするために使用される静的ライブラリファイル
-
gccの-staticのhello.c -oハロー
-
-
静的および動的コンパイルコンパイルの違い
-
使用するライブラリファイル形式は同じではありません
-
動的ライブラリを使用してコンパイル、動的、静的に静的ライブラリを使用してコンパイル
-
-
注意を払います
-
静的にコンパイルされた静的ライブラリが行くように梱包の実行可能ファイルにコンパイルする必要があります
-
動的コンパイルパッケージを動的に実行可能なプログラムファイルにコンパイルされていないだろう、それだけの関係をコンパイルおよびリンク
-
-
-
生産静的ライブラリ
-
gccの-c mylib.c -o mylib.o
-
AR RC libtestlib.a mylib.o
-
注意:静的ライブラリの名前libには.Aを終了して開始しなければならないとき
-
コンパイラ:
-
方法1
-
gccの-static mytest.c libtestlib.a -oのMyTest
-
-
方法2:ロードキングは、ヘッダファイルとライブラリファイルを指定することができます
-
たとえば、我々は次のlibtestlib.aのmylib.h /ホーム/先生に移動します
-
MV libtestlib.aのmylib.h /ホーム/教師
-
コンパイラのコマンド
-
gccの-static mytest.c -oのMyTest -L /ホーム/教師-ltestlib -I /ホーム/ tearcher
-
-
注意を払います
-
-Lライブラリファイルのパスを指定されています
-
ただのlib .A部分の背後にあるライブラリの前に指定したファイル名を検索するためにどのライブラリを指定-l
-
ヘッダファイルへのパスを指定します。
-
-
メソッドスリー
-
これは、ライブラリとヘッダファイルで指定したデフォルトパスに格納することができます
-
ロードキングは、デフォルトのライブラリファイル/ libまたは/ usr / libです
-
ヘッダファイルのデフォルトのパスは/ usr /などがあります
-
sudoのMV libtestlib.aは/ usr / libに
-
sudoのMV mylib.hは/ usr /含めます
-
-
コンパイラのコマンド
-
gccの-static mytest.c -oのMyTest -Itestlib
-
-
-
-
-
-
-
前処理、動的および静的ライブラリ
おすすめ
転載: www.cnblogs.com/fengzi759/p/11618706.html
おすすめ
ランキング