GCC / CLANGコンパイラ


GCCはLinuxのコンパイラで使用され、クランは、両方のコマンドは、ほぼ同じであるMACコンパイラで使用されている
Mac用の紙動作環境

コンパイラディレクティブ

gcc/clang -g -O2 -o test test.c -I... -L... -l...

-g出力ファイル内の情報デバッグ
デバッガは、その後、あなたが-O必要がない場合は、-O資本O、コマンドを実行し、出力ファイルを最適化するために、第二のファイルのコンパイラの最適化レベル2、より徹底し、
-o出力ファイルを
-Iは、ヘッダファイルの場所を指定し、サードパーティのライブラリを使用するか、または独自に作成し、
-Lは、libのライブラリの場所を指定する
-lはリンクを意味し、必ずしもすべて使用されていないライブラリを指定します

編集

main.cのvimの
主な機能ファイルを作成するには、Cプログラムは、エントリポイントとして、main関数でなければなりません

# include <stdio.h>
 
int main()
{
    printf("hello world\n")return 0;
}

前処理

gcc -E main.c -o main.i

-Eは、事前に生成されたファイルを表し

詳細:

  1. マクロ定義命令の#define XXXX
  2. 条件付きコンパイルの#ifの#else#endifの...
  3. #INCLUDEヘッダー・ファイルは、ソースコードとヘッダファイルをコピーする命令を一緒に含まれています
  4. 特殊記号処理パラメータ、例えば、方法処理空間

FAQ:
グローバル変数の定義は、同じファイルがヘッダファイルにグローバル変数を定義することを意味し、コードのセクションの存在のヘッダファイルが含まれているすべてのファイルを行いますので、その意志、ヘッダファイルにグローバル変数を定義することはできません必然的に紛争を引き起こします

まず、ソースファイルを前処理する、プロセスはプロセスであり、主* .iファイルを生成し、コマンドまたは(例えば、マクロ、#を含む、プリコンパイルされた命令の#ifdefなど)文の#番号を定義。コンパイラはコンパイルするように、すなわち、一緒にソースコードとヘッダファイルをコピーするために、決意及び他の動作を結合ファイルとマクロヘッダ

コンパイル

gcc -S main.i -o main.s

アセンブリ言語の出力を生成するようにコンパイラーにしましょう-S

詳細:
ソースコードセグメントをコンパイルすると、構文解析と同等の中間コードまたはアセンブリコードに変換され、字句解析、構文解析、によってアセンブリコードを生成する最適化プロセスを指します。局所的最適化、制御フロー解析とループの最適化、およびグローバルな最適化分析データストリーム。

字句解析、構文解析と意味解析、* .Sアセンブリファイルを生成します

編集

gcc -c main.s -o main.o

-cは(つまり、ソースファイルをコンパイル)が、リンクしていないコンパイラ、アセンブラ指定されたソースファイルを伝えます

バイナリ再配置可能なオブジェクトファイルを生成する機械語命令に変換、対応するアセンブリ命令の.o

リンク

VI add.cファイルを作成する方法を追加

#ifndef __MY_LIBRARY__
#define __MY_LIBRARY__
int add(int a, int b){
return (a+b);
}
#endif 

その後、コンパイルしたlibtoolを使用して、静的ライブラリはadd.oが含まれて生成します

gensees-iMac:study gensee$ vi add.c
gensees-iMac:study gensee$ clang -g -c add.c
gensees-iMac:study gensee$ ls add.o
add.o
gensees-iMac:study gensee$ ./add.o
gensees-iMac:study gensee$ libtool -static -o libmylib.a add.o

LIBファイルを生成
ここに画像を挿入説明
静的ライブラリで構成arを表示するには、このコマンドを使用します。例を

gensees-iMac:study gensee$ ar -t /Users/gensee/Desktop/study/libmylib.a 
__.SYMDEF SORTED
add.o

ARは、Linuxのコマンドは、より表示することですhttps://www.runoob.com/linux/linux-comm-ar.html

主な機能のファイルmain.cを作成し、.oのにコンパイル

#include <stdio.h>
#include "add.h"  
int main()
{
   int sum = add(1,5);
   printf("%d\n",sum);
   return 0;
}
clang -g -c main.c

ここでは、あまりにも、私たちはadd.h参照するために、ヘッダファイルを作成する必要があります
使用のvi add.hを

#ifndef __MY_LIBRARY__
#define __MY_LIBRARY__
int add(int a, int b);
#endif 

その後、我々はリンク

clang -o main main.o -L . -lmylib
gensees-iMac:study gensee$  clang -o main main.o -L . -lmylib
gensees-iMac:study gensee$ ./main
6
gensees-iMac:study gensee$ 

私たちは、addメソッドの実装の最終結果を見ることができる6

ステップ実行方法

前提はMYLIBにコンパイルされています

clang -g -o main mian.c -I . -L . -lmylib

-Iは、現在のディレクトリのヘッダを表します
。-L現在のディレクトリのlibを表します

gensees-iMac:study gensee$  clang -g -o main main.c -I . -L . -lmylib
gensees-iMac:study gensee$ ./main
6
gensees-iMac:study gensee$ 

リンクモード

動的および静的リンクリンクに分かれリンクシステムライブラリ、ライブラリ三者、

静的にリンクされたと2の間で動的にリンクされた最大の違いは、タイミングは、リンクが実行可能な形式の前にまだある、同じリンクではなく、動的にプログラムの実行時にリンクされていることです。

静的リンク:ライブラリ関数のコンパイルに使用されるソースファイルと結果のオブジェクトファイルは、実行ファイルを生成するためにマージの.o。それぞれは、必要なすべてのターゲット・ファイルのためのスペースの無駄を実行可能プログラムのコピーを持っている、と更新が実行可能なプログラムを形成する再コンパイルする必要があります。
ダイナミックリンク:スペースの無駄を静的リンクの解決困難な問題を更新し、唯一の各プログラムを使用することができ、メモリに保存され、一度にロードする必要があります。

命令ビューのURL:http://c.biancheng.net/view/2375.html

おすすめ

転載: blog.csdn.net/shengpeng3344/article/details/94436742