スタティックライブラリの作成


1. はじめに

共通の関数を複数のプログラムで使い回すとき、ライブラリにした方が楽。 ということで挑戦。

2. 次に

とりあえず腕ならし。簡単な関数をつくってみる。 あっさりできてしまった。 ソースは下。必要最低限しか書いていないから、見れば分かるでしょう。

3. 一応説明

error.c、util.cからライブラリをつくり、名前はlibutil.aとする。 そして、それとmain.cをいっしょにコンパイルする。それだけ。 手でコンパイルするとすると、以下のようになる。
% gcc -c error.c
% gcc -c util.c

% ar r libutil.a error.o util.o
% ranlib libutil.a

% gcc -o main main.c libutil.a
ライブラリとか言ってすごそうな名前だけど、要は、*.oファイルを一つにした だけ。 まあ、だからライブラリなんだろうけどね。

だから、これしきのプログラムだったら、こんなことをしなくても下だけでいいのだ。

% gcc -c error.c
% gcc -c util.c

% gcc -o main main.c error.o util.o

シェアドライブラリの作成

1.はじめに

共有ライブラリ、とも言う。 プログラム実行時に動的にロードされるライブラリのこと。 異なるプロセス同士で共有、はしないだろうなあ..分からないけど。

2.作る

やってみたら簡単だった。

3. 一応説明

上よりもさらに簡単なMakefileだと思うけれど、一応手順を紹介。 スタティックなやつとほとんど同じ。arを使わないところが違う。
% gcc -shared shutil.c -o libshutil.so 
% gcc shmain.c -o shmain ./libshutil.so

4. 実験

4.1 実験その1

動的にロードするのだから実験のしがいがある。 とりあえず、shutil.cを少し書き換えてlibshutil.soだけを作り替える。
% gcc -shared shutil.c -o libshutil.so 
そしてshmailを実行すると,,,あら不思議、変更点が反映されている!

4.2 実験その2

libshutil.soを、名前を変えたり場所を変えたり消したりする。
$ rm libshutil.so 
rm: `libshutil.so' を削除しますか(yes/no)? y
$ ./shmain 
./shmain: error in loading shared libraries: ./libshutil.so: cannot open shared object file: No such file or directory
おおっ。実行できなくなってる。すげえ。

3. Automake/Autoconfといっしょに

autoconf

3.1 やりたいこと

二種類のプログラムをつくっているのだが、共通のクラスがある。 これに関しては両方ともが使えるようになって欲しい。 もちろん、automake,autoconfをつかって簡単にコンパイルしたい。

3.2 状況設定

src下にライブラリができ、src2から利用する。
/project
┃  Makefile.am
┣ /src
┃    Makefile.ammain1.cppmyclass.hmyclass.cpp
┗ /src2
      Makefile.am ←1番のポイント
      main2.cpp

3.2 Makefile.amに書くこと

configure.inの書き方はいつもと同じ。 ちょっと違ってくるのはMakefile.am。
LDADD = ../1/libclass.a
を付け加える。