next up previous
次へ: 課題1 上へ: Application Program Interface作成の準備 戻る: コンパイルとリンク

ライブラリ

FamilyName関数とGivenName 関数をまとめてmynameにする。 このmynameを処理系に合わせてlibmyname.aというライブラリの名 前にする。(lib+myname+.a)

arコマンドは新しくライブラリファイルを作ったり、ライブラリファイルに新し くオブジェクトファイルを追加したり、入れ換えたり、また不要になったオブジェ クトファイルを削除したりすることなどができる。

$ ar rs libmyname.a FamilyName.o GivenName.o
  または
$ ar r libmyname.a FamilyName.o GivenName.o

ライブラリファイルが作成されていることを確認する。
$ ls
libmyname.a

ライブラリファイルに含まれているオブジェクトファイルを確認するばあいは次 のような引数tvを使えばよい。
$ ar tv libmyname.a
rw-r--r--  ------------- FamilyName.o
rw-r--r--  ------------- GivenName.o

さらにオブジェクトファイルの内容(シンボル)を確認するばあいはnmコマンドを 使えばよい。
$ nm libmyname.a

FamilyName.o:
00000000 T FamilyName
00000000 t gcc2_compiled.
         U printf

GivenName.o:
00000000 t gcc2_compiled.
00000000 T GivenName
         U printf

この作成したライブラリmynameを使ってメインプログラムの WriteName.cをコンパイル・リンクし、実行ファイルwritename3を 作ってみる。

$ gcc -o writename3 WriteName.c -L. -lmyname 
    または
$ gcc WriteName.c -L. -lmyname -o writename3
なお、-L .はライブラリmynameがカレントディレクトリに在ることを示してい る。別なディレクトリにある場合はそのディレクトリ名を書けばよい (例えば-L ~/mylib)。

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

メインプログラムWriteName.cのスペースを表示するprintf(" ");の部分 をSpaceという名前の関数にする。
#include <stdio.h>

int main()
{
   FamilyName();  // 姓
   Space();       // スペース
   GivenName();   // 名
   printf("\n");  // 改行
   return 0;
}
この変更したメインプログラムのソースファイル名をWriteName2.cとする。

Space関数の部分をSpace.cという名前のソースファイルにする。

void Space(void);

void Space()
{
   printf(" ");
}

Space.cをコンパイルしてオブジェクトファイルにする。
$ gcc -c Space.c
Space.oが生成されたことを確認する。
$ ls
Space.o

このオブジェクトファイルSpace.oをライブラリファイルlibmyname.aに追加する。
$ ar rs libmyname.a Space.o
追加されたことを確認する。
$ ar tv libmyname.a
rw-r--r--  ------------- FamilyName.o
rw-r--r--  ------------- GivenName.o
rw-r--r--  ------------- Space.o        // 追加された。

このライブラリを使って、変更したメインプログラムWriteName2.cから実 行ファイルwritename4を作ってみる。
$ gcc -o writename4 WriteName2.c -L . -lmyname

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



MANOME Yoichi 平成18年12月26日