library って何だ

Linux Top

更新日:むかし


ここでは例を使って記述しました。
C sorce code ( test.c & change.c ) で話を進めます


2つのソースコードを作成

$ editor test.c

#include 〈stdio.h〉


int main() {

  double d_num = 234.12003;
  int num;

  num = change(d_num);

  printf("%d\n",num);

  return 0;

}


$ editor change.c

int change(double d){

  int n;

  n = (int ) d;

  return n;

}



静的library(lib***.a)の作成

コンパイル時にコードに組み込まれる静的library(lib***.a)の作成
コンパイル時にコードに組み込まれるので実行ファイル形式で配布する
時はライブラリーを配布する必要は無い


$ gcc -c change.c
$ ar rv libtemp.a change.o
a - change.o
$ ls -a
.  ..  change.c  change.o  libtemp.a  test.c
$ gcc -o test test.c ./libtemp.a
$ ./test
234
$







共有library(lib***.so)の作成

プログラムの実行時に呼び出される共有library(lib***.so)の作成
プログラムが実行される時にライブラリーを参照するのでライブラリーも
一緒に配布しなければならない


$ ls -a
.  ..  change.c  test.c
$ gcc -fPIC -c change.c
       
       -fPIC  
              このオプションがターゲットマシンでサポートされていれば、位置独立
              なコードを出力します。このオプションはダイナミックリンクに適して
              おり、分岐において大きなディスプレースメントを要求する場合にも適
              応します。
$ gcc -shared -Wl,-soname,libtemp.so.1 -o libtemp.so.1.0 change.o -lc
       
          ・・・・・libtemp.so.1.0 と呼ばれる共有ライブラリ の作成

       -shared
              他のオブジェクトとリンクして実行可能プログラムを形成し得る共有オ
              ブジェクトを生成します。ごく少数のシステムでのみ、このオプション
              はサポートされています。
       -Wl,option
              オプション option をリンカに渡します。option がコンマを含む場合
              は、それらのコンマで複数のオプションとして分割されます。
	   -lc
              C ライブラリとリンクさせるために
		

$ ln -sf libtemp.so.1.0 libtemp.so.1
       
          ・・・・・動的リンカ用のシンボリックリンク(libtemp.so.1) の作成

$ ln -sf libtemp.so.1 libtemp.so
       
          ・・・・・ld 用のシンボリックリンク(libtemp.so) の作成

$ gcc -o test test.c -L. -ltemp
       
       -ltemp
              名前がtempであるライブラリをリンク時に使用します。

              リンカは、標準のライブラリ用ディレクトリのリスト中から、実際のフ
              ァイル名が `liblibrary.a' であるファイルを検索します。リンカはこ
              のファイルを、ファイル名で直接指定した場合と同様に使用します。

              検索するディレクトリには、いくつかの標準システムディレクトリと
              、`-L' によって指定したディレクトリが含まれます。
              通常、この方法で発見されるファイルはライブラリファイル、つまりい
              くつかのオブジェクトファイルをメンバとして含むアーカイブファイル
              です。リンカは、アーカイブファイルの中を検索して、参照されている
              が定義されていないシンボルを定義しているメンバを探し出します。し
              かし、もしリンカがライブラリでなく通常のオブジェクトファイルを発
              見した場合は、そのオブジェクトファイルを通常の方法でリンクします
              。`-l' オプションを使用する場合とファイル名を直接指定する場合 の
              違 いは、`-l' の場合が library を `lib' と `.a' で囲み、いくつも
              のディレクトリを検索することだけです。

$ ./test
  234
$






共有library(lib***.so)を登録
これで上手くいった方は
$ su
Password: 
# cp libtemp.so.1.0 /usr/lib
# cd /usr/lib
# ln -s libtemp.so.1.0 libtemp.so.1
# ln -s libtemp.so.1 libtemp.so
# /sbin/ldconfig

ldconfig option
       -n       コマンドラインで指定されたディレクトリのみを処理する。通常共有
              ライブラリが置かれるディレクトリ  (/lib   と  /usr/lib)   や
              /etc/ld.so.conf で指定されたディレクトリは処理しない。暗黙のうち
              に -N が指定される。


$ gcc -o test test.c -ltemp
$ ./test
234
$ 

何となく理解できたと思う



この説明で物足りない方は、または、もっと詳しく知りたい方は以下を参照下さい
http://www.linux.or.jp/JF/JFdocs/Program-Library-HOWTO.txt
http://www.linux.or.jp/JF/JFdocs/LFS-BOOK.txt


Top Page(LINUX導入日記)へ