Linux環境におけるC

10850 ワード

Cプログラミングにおける関連ファイル接尾辞
.a
静的ライブラリ(archive)
.c
Cソースコード(前処理のコンパイルが必要)
.h
Cソースヘッダファイル
.i
Cソースコード(前処理のコンパイル不要)
.o
オブジェクトファイル
.s
アセンブリ言語コード
.so
ダイナミックライブラリ
[編集]単一ソースファイル生成実行可能プログラム
簡単な「hello,ubuntu」プログラムのソースコードを次に示します.
/* helloubuntu.c */
#include <stdio.h>
int main(int argc,char *argv[])
{
	printf("hello, ubuntu
"
); return 0; }

このコードを実行可能プログラムとして最も簡単に直接コンパイルする方法は、このコードをファイルhelloubuntuとして保存することである.c、次のコマンドを実行します.
$ gcc -Wall helloubuntu.c
 

コンパイラは、コマンドラインで指定したファイルの接尾辞名をチェックすることで、Cソースファイルとして認識します.GCCのデフォルトの動作:ソースファイルをコンパイルしてオブジェクトファイル(object file)を生成し、リンクオブジェクトファイルは実行可能プログラムを得て、オブジェクトファイルを削除します.コマンドラインに実行可能プログラムのファイル名が指定されていないため、コンパイラはデフォルトのa.outを採用します.コマンドラインにプログラム名を入力して実行し、結果を表示します.
$ ./a.out
hello, ubuntu

オプション-oは、生成された実行可能プログラムのファイル名を指定するために使用されます.次のコマンドはhelloubuntuという実行可能プログラムを生成します.
$ gcc -Wall helloubuntu.c -o helloubuntu

コマンドラインにプログラム名を入力すると、次のように実行されます.
$ ./helloubuntu
hello, ubuntu

注意mathに役に立つ場合.hライブラリなどgccデフォルトで呼び出されない標準ライブラリは、-lmパラメータを使用してください
[編集]ソースファイル生成オブジェクトファイル
オプション-cは、GCCがソースファイルをコンパイルすることを示しますが、オブジェクトファイルをディスクに保持し、リンクオブジェクトファイルをスキップして実行可能ファイルを生成するステップをスキップします.この場合、デフォルトの出力ファイルのファイル名はソースコードのファイル名と一致するが、接尾辞がo .例えば、次のコマンドはhelloubuntuという名前を生成します.oのオブジェクトファイル:
$ gcc -c -Wall helloubuntu.c

オプション-oは、生成されたオブジェクトファイルのファイル名を指定するために使用できます.次のコマンドはkubuntuという名前を生成します.oのオブジェクトファイル:
$ gcc -c -Wall helloubuntu.c -o kubuntu.o

オブジェクトライブラリを構築したり、後でリンクするために一連のオブジェクトファイルを生成したりすると、1つのコマンドで複数のソースファイルから対応するオブジェクトファイルを生成できます.次のコマンドは、オブジェクトファイルubuntuを生成します.o, kubuntu.oとxubuntu.o:
$ gcc -c -Wall ubuntu.c kubuntu.c xubuntu.c

[編集]複数のソースファイル生成実行可能プログラム複数のソースファイルがコンパイルされても、GCCコンパイラは自動的にリンク操作を行います.例えば、次のコードはhellomainという名前で保存する.cのファイルでsayhello()という関数を呼び出します.
/* hellomain.c */
void sayhello(void);
int main(int argc,char *argv[])
{
	sayhello();
	return 0;
}

次のコードはsayhelloという名前で保存されます.cのファイルにsayhello()関数が定義されています.
/* sayhello.c */
#include <stdio.h>
void sayhello()
{
	printf("hello, ubuntu
"
);/* , gcc */ }

次のコマンドは、2つのファイルをそれぞれオブジェクトファイルにコンパイルし、実行可能プログラムhelloにリンクし、オブジェクトファイルを削除します.
$ gcc -Wall hellomain.c sayhello.c -o hello

[編集]コンパイル前処理
オプション−Eは、コンパイラがコンパイル前処理のみを行うことを示す.次のコマンドは、ソースファイルを前処理します.c結果を標準出力にリストする:
$ gcc -E helloubuntu.c

オプション-oは、前に処理したコードをファイルに指向するために使用されます.本明細書で最初に示す接尾辞のリストに示すように、前処理のCソースファイルを接尾辞として保存する必要はない.iのファイルでは、このようなファイルを得ることができます.
$ gcc -E helloubuntu.c -o helloubuntu.i

[編集]アセンブリコードの生成
オプション-Sは、コンパイラがアセンブリ言語コードを生成して終了することを示す.次のコマンドはCソースファイルhelloubuntu.cアセンブリ言語ファイルを生成するs:
$ gcc -S helloubuntu.c

アセンブリ言語の形式は、コンパイラのターゲットプラットフォームに依存します.複数のソースファイルがコンパイルされると、各ファイルはそれぞれ対応するアセンブリコードモジュールを生成します.
[編集]静的ライブラリの作成
静的ライブラリはコンパイラが生成する通常のものである.oファイルの集合.プログラムをリンクするときにライブラリ内のオブジェクトファイルを使用するか、ディレクトリ内のオブジェクトファイルを使用するかは同じです.静的ライブラリのもう一つの名前はアーカイブ(archive)で、このアーカイブを管理するツールはarです.
ライブラリを構築するには、まずライブラリに必要なオブジェクトモジュールをコンパイルします.例えば、次の2つのソースファイルはhellofirst.cとhellosecond.c:
/* hellofirst.c */
#include <stdio.h>
void hellofirst()
{
	printf(“The first hello
); }
/* hellosecond.c */
#include <stdio.h>
void hellosecond()
{
	printf(“The second hello
); }

この2つのソースファイルは、次のコマンドでオブジェクトファイルにコンパイルできます.
$ gcc -c -Wall hellofirst.c hellosecond.c

プログラムarはパラメータ-rと組み合わせて新しいライブラリを作成し、オブジェクトファイルを挿入することができます.ライブラリが存在しない場合、パラメータ-rは新しいものを作成し、必要に応じてアーカイブファイルにオブジェクトモジュールを追加します.次のコマンドは、この例の2つのオブジェクトモジュールを含むlibhelloを作成します.aの静的ライブラリ:
$ ar -r libhello.a hellofirst.o hellosecond.o
ライブラリが構築され、使用可能になりました.次のプログラムcライブラリ内の2つの関数が呼び出されます.
/* twohellos.c */
void hellofirst(void);
void hellosecond(void);
int main(int argc,char *argv[])
{
	hellofirst();
	hellosecond();
	return 0;
}

プログラムtwohellosは、コマンドラインでライブラリを指定してコマンドでコンパイルおよびリンクできます.コマンドは次のとおりです.
$ gcc -Wall twohellos.c libhello.a -o twohellos

静的ライブラリの命名慣例は、名前が3文字libで始まる接尾辞である.a終了.すべてのシステム・ライブラリはこのネーミング・ルールを採用しており、-l(ell)オプションを使用してコマンド・ラインのライブラリ名を簡単に書くことができます.次のコマンドと以前のコマンドの違いは、gccがライブラリを探す場所が異なることだけです.
$ gcc -Wall twohellos.c -lhello -o twohellos

完全なパス名を指定すると、コンパイラが指定したディレクトリでライブラリを検索できます.ライブラリ名は、/usr/worklibs/libhello.aなどの絶対パスまたは./lib/libhello.aなどの現在のディレクトリに対する相対パスとして指定できます.オプション-lは、パスを指定する能力を持つことはできませんが、コンパイラがシステムライブラリディレクトリの下でライブラリを検索する必要があります.
[編集]共有ライブラリの作成
共有ライブラリは、コンパイラが特殊な方法で生成したオブジェクトファイルの集合です.オブジェクトファイルモジュール内のすべてのアドレス(変数参照または関数呼び出し)は絶対的ではなく相対的であり、共有モジュールがプログラムの実行中に動的に呼び出され、実行されることができる.共有ライブラリを構築するには、まずライブラリに必要なオブジェクトモジュールをコンパイルします.たとえば、shellofirstというファイル名を次に示します.cとshellosecond.cの2つのソースファイル:
/* shellofirst.c */
#include <stdio.h>
void shellofirst()
{
	printf(“The first hello from a shared library
); } /* shellosecond.c */ #include <stdio.h> void shellosecond() { printf(“The second hello from a shared library
); }

以上の2つのソースファイルをオブジェクトファイルにコンパイルするには、次のコマンドを使用します.
$ gcc -c -Wall -fpic shellofirst.c shellosecond.c

オプション-cはコンパイラに生成のみを通知する.oのオブジェクトファイル.オプション-fpicは、生成されたオブジェクトモジュールにフローティング(再配置可能)アドレスを採用する.マイクロワードpicは「位置依存コード」(position independent code)を表す.
次のgccコマンドは、オブジェクトファイルをhelloという名前に構築します.soの共有ライブラリ:
$ gcc -Wall -shared shellofirst.o shellosecond.o -o hello.so

オプション-oは、出力ファイルに名前を付けるために使用され、ファイル接尾辞名が使用される.soはコンパイラにオブジェクトファイルを共有ライブラリにリンクするように伝えます.通常、リンクはmain()関数をプログラムのエントリとして位置決めして使用しますが、この例では出力モジュールにはこのようなエントリポイントはなく、エラーオプション-sharedを抑制するために必要です.
コンパイラは接尾辞を.cのファイルはC言語ソースファイルとして認識され,オブジェクトファイルにコンパイルする方法が知られている.この点に基づいて、以前の2つのコマンドを1つにまとめることができます.次のコマンドは、モジュールを直接コンパイルして共有ライブラリとして保存します.
$ gcc -Wall -fpic -shared shellofirst.c shellosecond.c -o hello.so
以下のプログラムは、ファイルstwohellosに格納される.c内は、共有ライブラリ内の2つの関数を呼び出すメインプログラムです.
/* stwohellos.c */
void shellofirst(void);
void shellosecond(void);
int main(int argc,char *argv[])
{
	shellofirst();
	shellosecond();
	return 0;
}

このプログラムは、次のコマンドで共有ライブラリをコンパイルしてリンクできます.
$ gcc -Wall stwohellos.c hello.so -o stwohellos

プログラムstwohelloは完了しましたが、実行するには共有ライブラリhelloにナビゲートできるようにする必要があります.so,ライブラリ内の関数はプログラム実行時にロードされるからである.なお、現在の作業ディレクトリは共有ライブラリの検索パスにない場合がありますので、以下のコマンドラインを使用して環境変数LD_を設定する必要があります.LIBRARY_PATH:
   $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

[編集]命名規則を超える
もし環境があなたに使用を要求したら.c以外の接尾辞名でCソースファイルの名前を付けます.-xオプションで対応する言語を指定して、私たちの名前規範を無視することができます.たとえば、次のコマンドはファイルhelloworldから実行されます.jxjはC言語ソースコードをコンパイルし、実行可能ファイルhelloubuntuを生成する.
$ gcc -xc helloubuntu.jxj -o helloubuntu

通常、-xオプションがない場合、未知の接尾辞名を持つソースファイル名は、コネクタが認識できるオプションとみなされ、変更なしにリンクに渡されます.オプション-xは、その後の未知の接尾辞のすべてのファイルに役立ちます.例えば、以下のコマンドはgccにalignを与える.zzzとtypes.xxxはすべてCソースファイルとして処理します:
$ gcc -c -xc align.zzz types.xxx