next up previous
次へ: ライブラリ 上へ: Application Program Interface作成の準備 戻る: Application Program Interface作成の準備

コンパイルとリンク

つぎのような自分の名前を表示するプログラムを作成して実行する。

#include <stdio.h>

main()
{
    printf("Manome Yoichi\n");
}
自分の名前に変更して実行すること。 gccでコンパイルする方法を忘れたものは、「Cの絵本」の180ページを参照。

つぎのように名前を姓(family name)と名(given name)に分けて、実行してみる。

#include <stdio.h>

main()
{
    printf("Manome");  // 姓
    printf(" ");       // スペース
    printf("Yoichi");  // 名
    printf("\n");      // 改行
}

つぎのように姓(Family Name)と名(Given Name)を関数にして、実行してみる。

#include <stdio.h>

FamilyName()
{
  printf("Manome");
}

GivenName()
{
  printf("Yoichi");
}

main()
{
   FamilyName();   // 姓
   printf(" ");    // スペース
   GivenName();    // 名 
   printf("\n");   // 改行
}

つぎのようにFamilyName関数とGivenName関数をmainの下に置いて、実行してみる。

#include <stdio.h>

main()
{
   FamilyName();
   printf(" ");
   GivenName();
   printf("\n");
}

FamilyName()
{
  printf("Manome");
}

GivenName()
{
  printf("Yoichi");
}

処理系によっては、mainの中でFamilyName関数やGivenName関数と対応がとれないことがある。そのような場合はつぎのようにプロトタイプ(ひな型)を宣言しておく。(「Cの絵本」の96ページを参照)
#include <stdio.h>

void FamilyName(); // プロトタイプ宣言
void GivenName();  // プロトタイプ宣言 

main()
{
   FamilyName();
   printf(" ");
   GivenName();
   printf("\n");
}

void FamilyName()    // プロトタイプ宣言した関数本体
{
   printf("Manome");
}

void GivenName()    //  プロトタイプ宣言した関数本体
{
   printf("Yoichi");
}

上記のプログラムをUNIX(Linux)系の処理に合わせて正しく書くと次のようにな るが、ある程度簡略化してよい。
#include <stdio.h>

void FamilyName(void);
void GivenName(void);

int main(void)
{
   FamilyName();
   printf(" ");
   GivenName();
   printf("\n");
   return(0);
}

void FamilyName(void)
{
   printf("Manome");
}

void GivenName(void)
{
   printf("Yoichi");
}

このソースファイルをmain関数とFamilyName関数とGivenName関数の3つに分割する。 (「Cの絵本」の148ページを参照)

最初に、main関数の部分をWriteName.cという名前で独立したソースファイルにする。

#include <stdio.h>

int main(void)
{
   FamilyName();
   printf(" ");
   GivenName();
   printf("\n");
   return(0);
}

つぎに、FamilyName関数の部分をFamilyName.cという名前で独立したソースファイルにする。

void FamilyName(void);

void FamilyName()
{
   printf("Manome");
}

最後に、GivenName 関数の部分をGivenName.cという名前で独立したソースファイルにする。

void GivenName(void);

void GivenName()
{
   printf("Yoichi");
}

三つのソースファイルに分割されていることを確認する。
$ ls
FamilyName.c GivenName.c WriteName.c

この三つのソースファイルをコンパイル・リンクして実行ファイルwritenameを 作る。(「Cの絵本」の148ページを参照)

$ gcc -o writename FamilyName.c GivenName.c WriteName.c
    または
$ gcc FamilyName.c GivenName.c WriteName.c -o writename

実行ファイルwritenameを実際に実行してみる。
$ ./writename
Manome Yoichi

上記のコンパイル・リンクする方法は、もし三つのファイルのうち一つにエラー があったばいには、そのファイルを修正して、再び全てのファイルをコンパイル・ リンクすることになるので、エラーのない二つのファイルを無駄にコンパイルす ることになる。

この様な無駄を省くために、通常は次のように分割コンパイルをおこなう。
$ gcc -c WriteName.c
$ gcc -c FamilyName.c
$ gcc -c GivenName.c

コンパイルにエラーがなければ、次のようなオブジェクトファイルが出来ている。
$ ls
FamilyName.o GivenName.o WriteName.o

この三つのオブジェクトファイルをリンクして実行ファイルwritename2を作る。 (「Cの絵本」の148ページを参照)
$ gcc -o writename2 FamilyName.o GivenName.o WriteName.o
    または
$ gcc FamilyName.o GivenName.o WriteName.o -o writename2

実行ファイルwritename2を実際に実行してみる。
$ ./writename2
Manome Yoichi



MANOME Yoichi 平成18年12月26日