Linux GCC共通コマンド詳細
GCCの意味もGNU C Compilerだけです。ここ数年の発展を経て、GCCはすでにC言語をサポートするだけでなく、Ada言語、C++言語、Java言語、Objective C言語、Pascal言語、COBOL言語、関数式プログラミングと論理プログラミングをサポートするMercury言語などもサポートされています。GCCもGNU C言語コンパイラという意味だけではなく、GNU Compiler CollectionつまりGNUコンパイラファミリーという意味になりました。一方,GCCのオペレーティングシステムプラットフォームおよびハードウェアプラットフォームに対するサポートといえば,一言で言えば,どこにでもある.
2.単純コンパイルサンプル・プログラムは次のとおりです。
//test.c #include int main(void) { printf("Hello World!\n"); return 0; }
このプログラムは、一歩一歩のコンパイル命令です。
gcc test.c -o test
実質的に、上記のコンパイルプロセスは、前処理(プレコンパイル、Preprocessingとも呼ばれる)、コンパイル(Compilation)、アセンブリ(Assembly)、および接続(Linking)の4段階に分けて行われる。
2.1前処理gcc -E test.c -o test.iまたはgcc-E test.c
testを出力できます。iファイルにtestが格納されている.c前処理後のコード。開くi書類、見てみれば、分かります。後のコマンドは、コマンドラインウィンドウに直接前処理後のコードを出力します。
gccの-Eオプションは,コンパイラを前処理後に停止させ,前処理結果を出力することができる.本例では、前処理の結果stdioとなる.hファイルの内容をtestに挿入する.cに当たった。
2.2アセンブリコードにコンパイル(Compilation)前処理後、生成するtestに直接対することができる.iファイルのコンパイル、アセンブリコードの生成:
gcc -S test.i -o test.s
gccの-Sオプションは、プログラムコンパイル中にアセンブリコードを生成した後、停止し、-o出力アセンブリコードファイルを示す。
2.3アセンブリ(Assembly)前のセクションで生成するアセンブリコードファイルtestについて.s,gasアセンブリは、次のようにターゲットファイルにコンパイルする責任を負います。
gcc -c test.s -o test.o
2.4接続(Linking)gccコネクタはgasが提供し、プログラムのターゲットファイルを必要なすべての追加のターゲットファイルに接続し、最終的に実行可能なファイルを生成する責任を負います。追加のターゲットファイルには、静的接続ライブラリと動的接続ライブラリが含まれます。
前のセクションで生成するtestについて.o,これをC標準入出力ライブラリに接続し,最終的にプログラムtestを生成する
gcc test.o -o test
コマンドラインウィンドウで./test、ハローワールドと言わせましょう!
3.複数のプログラムファイルのコンパイル通常、プログラム全体は複数のソースファイルからなり、それに応じて複数のコンパイルユニットが形成され、GCCを用いてこれらのコンパイルユニットをうまく管理することができる。test 1があると仮定する.cとtest 2.c 2つのソースファイルからなるプログラムは、それらをコンパイルし、最終的に実行可能なプログラムtestを生成するために、次のコマンドを使用することができます。
gcc test1.c test2.c -o test
同時に処理されたファイルが1つ以上ある場合、GCCは前処理、コンパイル、リンクの手順に従って順次行われます。深く考えると、上記のコマンドは、次の3つのコマンドを順次実行することにほぼ相当します。
gcc -c test1.c -o test1.o gcc -c test2.c -o test2.o gcc test1.o test2.o -o test
4.エラーチェックgcc -pedantic illcode.c -o illcode
-pedanticコンパイルオプションは、コンパイラがANSI/ISO C規格と完全に互換性があることを保証するものではありません。Linuxプログラマーがこの目標に近づくのを助けるためにしか使用できません。あるいは、-pedanticオプションは、プログラマーがANSI/ISO C規格に合致しないコードを発見するのに役立ちますが、すべてではありません。実際には、ANSI/ISO C言語規格でコンパイラ診断が要求されている場合だけ、GCCに発見され、警告される可能性があります。
-pedanticに加えて、GCCにはいくつかの他のコンパイルオプションも有用な警告情報を生成することができます。これらのオプションの多くは-Wで始まり、その中で最も価値のある当数-Wallであり、GCCにできるだけ多くの警告情報を生成させることができます。
gcc -Wall illcode.c -o illcode
GCCからの警告メッセージは厳密には誤りとは言えないが,誤りの居場所になる可能性が高い.優れたLinuxプログラマーは、自分のコードが常に標準的で丈夫な特性を維持するように、警告情報を避ける必要があります。だから警告情報を符号化エラーとして扱うのは、称賛に値する行為です!したがって、コンパイラに-Werrorオプションを付けると、GCCは警告が発生したすべての場所でコンパイルを停止し、プログラマに自分のコードを修正させます。以下のようにします。
gcc -Werror test.c -o test
5.ライブラリファイル接続ソフトウェアを開発する際、サードパーティ製の関数ライブラリを全く使用しないことは珍しく、通常、多くの関数ライブラリのサポートを借りて対応する機能を完了する必要があります。プログラマの観点から見ると、関数ライブラリは実際にはヘッダファイル(.h)とライブラリファイル(so、またはlib、dll)の集合である。。Linuxのほとんどの関数はデフォルトで/usr/include/ディレクトリにヘッダファイルを配置しますが、ライブラリファイルは/usr/lib/ディレクトリに配置されます。Windowsで使用するライブラリファイルは、主にVisual Stidoのディレクトリの下にあるincludeとlib、およびシステムフォルダの下に配置されます。しかし、使用するライブラリがこれらのディレクトリの下にない場合もあるので、GCCはコンパイル時に必要なヘッダファイルとライブラリファイルを独自の方法で検索する必要があります。
例えばプログラムですcはlinux上でcを使ってmysqlに接続して、この时私达はmysqlの公式サイトに行ってMySQL ConnectorsのCライブラリをダウンロードしなければならなくて、ダウンロードして解凍した后に、1つのincludeフォルダがあって、中はmysql connectorsのヘッダファイルを含んで、もう1つのlibフォルダがあって、中はバイナリsoファイルlibmysqlclientを含みます.so
ここでincluldeフォルダのパスは/usr/dev/mysql/include、libフォルダは/usr/dev/mysql/libです
5.1実行可能ファイルへのコンパイルまずコンパイルを行いますcをターゲットファイルとし、このとき実行する必要がある
gcc –c –I /usr/dev/mysql/include test.c –o test.o
5.2リンク最後に、すべてのターゲットファイルを実行可能ファイルにリンクします。
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
Linuxの下のライブラリファイルには、動的リンクライブラリ(通常.soで終わる)と静的リンクライブラリ(通常.aで終わる)の2つのクラスがあります。両者の違いは、プログラム実行時に必要なコードが実行時に動的にロードされるか、コンパイル時に静的にロードされるかだけです。
5.3リンク強制時の静的リンクライブラリの使用デフォルトでは、GCCはリンク時にダイナミックリンクライブラリを優先し、ダイナミックリンクライブラリが存在しない場合にのみ静的リンクライブラリを使用することを考慮し、必要に応じてコンパイル時に-staticオプションを追加して、静的リンクライブラリを強制的に使用することができます。
/usr/dev/mysql/libディレクトリの下にリンクがある場合に必要なライブラリファイルlibmysqlclient.soとlibmysqlclient.a,GCCがリンク時に静的リンクライブラリのみに使用されるようにするには,以下のコマンドを用いることができる.
gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test
静的ライブラリリンク時のパスの検索順序:
1.ldはGCCコマンドのパラメータ-Lを探します
2.さらにgccの環境変数LIBRARYを探すPATH
3.内定ディレクトリ/lib/usr/lib/usr/local/libを探しますこれは当初compile gccの時にプログラム内に書いたものです
動的リンク時、実行時のパスの検索順序:
1.ターゲットコードのコンパイル時に指定した動的ライブラリ検索パス
2.環境変数LD_LIBRARY_PATH指定の動的ライブラリ検索パス
3.プロファイル/etc/ld.so.confで指定したダイナミックライブラリ検索パス
4.デフォルトのダイナミックライブラリ検索パス/lib
5.デフォルトのダイナミックライブラリ検索パス/usr/lib
環境変数について:
LIBRARY_PATH環境変数:プログラム静的リンクライブラリファイル検索パスを指定する
LD_LIBRARY_PATH環境変数:プログラム動的リンクライブラリファイル検索パスを指定する