Search on the blog

2014年3月16日日曜日

静的ライブラリと動的ライブラリを作る

まえがき
gccで静的ライブラリと動的ライブラリを作ってみました。静的ライブラリは前回のポストにも載せましたが、対比が分かりやすいように再掲します。

静的ライブラリをつくる
静的ライブラリは、libxxx.aというファイルです。拡張子のaはarchiveの略です。
以下では、加減乗除を行う関数が定義されたadd.o、sub.o、mul.o、div.oをarchiveしてlibhoge.aというファイルを作成します。

kenjih$ gcc -c add.c
kenjih$ gcc -c sub.c
kenjih$ gcc -c mul.c
kenjih$ gcc -c div.c
kenjih$ ar -q -v libhoge.a *.o
のようにして静的ライブラリを作成します。

main.cからlibhoge.aの機能を使用する場合は、以下のようにコンパイルします。
kenjih$ gcc -o main main.c -L. -lhoge
-Lはライブラリの検索パスの指定です。libhoge.aがカレントディレクトリにある場合は、-L.のようにします。

動的ライブラリをつくる
動的ライブラリは、libxxx.soというファイルです。拡張子のsoはshared objectの略です。 静的ライブラリのときと同様に加減乗除を関数を定義したオブジェクトファイルをまとめてライブラリにします。
kenjih$ gcc -c -fPIC add.c
kenjih$ gcc -c -fPIC sub.c
kenjih$ gcc -c -fPIC mul.c
kenjih$ gcc -c -fPIC div.c
kenjih$ gcc *.o -shared -o libhoge.so
のようにして動的ライブラリを作成することができます。

コンパイルするときは以下のようにします。
kenjih$ gcc -o main main.c -L. -lhoge
コンパイルは静的ライブラリにリンクするときと同様です。gccのリンカは-lxxxと指定されたとき、まずlibxxx.soを探してあればそれをリンクします。libxxx.soが無ければlibxxx.aを探してそれをリンクします。

動的ライブラリはランタイム時にリンクされます。実行ファイルがどの動的ライブラリに依存しているかはlddコマンドで確認できます。
kenjih$ ldd main
	linux-gate.so.1 =>  (0xb77af000)
	libhoge.so => not found
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75ea000)
	/lib/ld-linux.so.2 (0xb77b0000)
libhoge.soがnot foundとなっています。これはlibhoge.soがデフォルトのライブラリ検索パス内に存在しないからです。libhoge.soを適切なパスに移動させてもいいですが、環境変数LD_LIBRARY_PATHに動的ライブラリのパスを指定することも出来ます。

export LD_LIBRARY_PATH=$(pwd)
を実行して、libhoge.soファイルがあるカレントディレクトリをLD_LIBRARY_PATHに指定します。

再度lddコマンドを実行してみます。
kenjih$ ldd main
	linux-gate.so.1 =>  (0xb771c000)
	libhoge.so => /home/kenjih/programming/cpp/sample2/dynamic/libhoge.so (0xb7717000)
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7554000)
	/lib/ld-linux.so.2 (0xb771d000)
で作成した動的ライブラリの場所が認識されたことが分かります。./mainを実行すると、libhoge.soが動的にリンクされます。

0 件のコメント:

コメントを投稿