GhaSShee


Shared Library


UNIX .so Windows .dll 
 # Shared Objectを作ってみる ## ライブラリ側のヘッダとソースを用意 hello.h ~~~ #ifndef __HELLO_H__ #define __HELLO_H__ void say(); #endif ~~~ libhello.c ~~~ #include #include "hello.h" void say() { printf("Hello, World!\n"); } ~~~ ## ライブラリをmakeする ~~~ gcc -fPIC -c libhello.c -o libhello.lo gcc -shared -Wl,-soname,libhello.so libhello.lo -o libhello.so ~~~ * `-fPIC` : position-independent code(PIC)を作成する。 * `-c` : コンパイルおよびアセンブルまででリンクはしない。 * `-shared` : 共有オブジェクトの生成。 * `-Wl,option` : optionをリンカに渡す。ここでは"-soname libhello.so"が渡される。 man gccによると-fPICと-fpicは違うよう sonameというのはライブラリが持つ名前で、実行時にはこの名前で動的リンクが行われるらしい。 なので全然関係ないファイル名とかでもlibhello.soというsonameを持っていればそいつのリンクされる。 詳しいことはThe Linux GCC HOWTO「6.4 自分のライブラリを作る」あたりを見ればいいと思う。 ## ldconfigでシステムに認識させる 先のsonameの説明の通り、ファイル名ではなくsonameでリンクが決定されるような仕組みになっているので、その辺のことをシステムに認識させてやる必要がある。 ~~~ ldconfig -n . ~~~ 本来であれば/usr/libとかに置く。 テストファイルは置きたくないので、-nでカレントディレクトリを対象に処理させる。 # Shared Objectを使ってみる ## 使う側のソースを用意 ~~~ #include "hello.h" int main(int argc, char** argv) { say(); return 0; } ~~~ ## プログラムをmakeする ~~~ gcc -c -o hello.o hello.c gcc -o hello -L. -lhello hello.o ~~~ * `-llibrary` : リンクするライブラリ名を指定する。libを除いた名前を指定するのかな。 * `-Ldir` : -lで検索が行われるディレクトリにdirを追加する。 man gccによると リンカは、標準のライブラリ用ディレクトリのリスト中から、実際のファイル名が ‘liblibrary.a’ であるファイルを検索します。リンカはこのファイルを、ファイル名で直接指定した場合と同様に使用します。 ## 実行してみる ~~~ LD_LIBRARY_PATH=. ./hello ~~~ ライブラリ本来の置き場所に.soを置いてないので、LD_LIBRARY_PATH環境変数にlibhello.soが存在するカレントディレクトリを指定して実行。 ~~~ Hello, World! ~~~