スタティックライブラリの作成
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
おおっ。実行できなくなってる。すげえ。
autoconf
3.1 やりたいこと
二種類のプログラムをつくっているのだが、共通のクラスがある。
これに関しては両方ともが使えるようになって欲しい。
もちろん、automake,autoconfをつかって簡単にコンパイルしたい。
3.2 状況設定
src下にライブラリができ、src2から利用する。
/project
┃ Makefile.am
┣ /src
┃ Makefile.am
┃ main1.cpp
┃ myclass.h
┃ myclass.cpp
┗ /src2
Makefile.am ←1番のポイント
main2.cpp
3.2 Makefile.amに書くこと
configure.inの書き方はいつもと同じ。
ちょっと違ってくるのはMakefile.am。
を付け加える。