UNIXプログラミング質問すれ Part10 343より

有用だと思ったので、こぴぺ

343 名前: デフォルトの名無しさん Mail: 投稿日: 2012/02/20(月) 21:50:08.25
ファイル hello.c

#include 
void hello(void) {printf("hello world\n");}

ファイル hello.h

#ifndef __HELLO_H__
#define __HELLO_H__
extern void hello(void);
#endif //__HELLO_H__

ファイル main.c

#include 
#include 
main(){hello();}

ソースコードが何をしてるかは一目瞭然なので説明はしない。
わからない人はさようなら。

これを通常のリンクでビルドする場合

gcc -o a main.c hello.c -I./

345 名前: 343 Mail: 投稿日: 2012/02/20(月) 21:52:35.46
これの hello.c モジュールを動的ライブラリにする場合、

最も基本的な方法だと以下のようになる。

gcc -fPIC -c hello.c
gcc -fPIC -shared -Wl,-soname,libhello.so -o libhello.so hello.o

#インストール作業

install libhello.so /usr/lib/
install hello.h /usr/include/

結果、
/usr/lib/、/usr/include/にライブラリーとしてコピーされる。

しかしこれではまだライブラリーは有効にならない。ldへの登録の必要がある。

ldconfig

これで libhello.so を使えるようになった。
あとは通常のライブラリをリンクする場合のやり方でビルドできる。

gcc -o a main.c -lhello

346 名前: 343 Mail: 投稿日: 2012/02/20(月) 21:53:39.53
libtoolを使って同様のことをする場合

libtool --mode=compile gcc -c hello.c
libtool --mode=link gcc -o libhello.la hello.o -rpath /usr/lib

#インストール作業

libtool --mode=install install libhello.la /usr/lib/libhello.la
libtool --mode=install install hello.h /usr/include/hello.h
ldconfig

あとは普通にリンクできる。

gcc -o a main.c -lhello

しかし、libtoolの有用な点は、この gcc -o a main.c -lhello も共通書式で書ける点にもある。
同じが、このようにも書ける。

libtoo --mode=compile gcc -o a main.c /usr/lib/libhello.la

これは何を意味するかというと、動的ライブラリーが使用できないOSの場合は、libtoolは静的ライブラリを生成する。libhello.a
もしも libhello.aの場合は、gcc の書式は動的ライブラリの場合とは異なり、以下のようになるが、

静的ライブラリの場合: gcc -o a main.c /usr/lib/libhello.a
動的ライブラリの場合: gcc -o a main.c -lhello

この書式の違いを、共通の書式で統一できるのが libtoolの利点である。

libtool --mode=compile gcc -o a main.c /usr/lib/libhello.la

と書くことで、OSの対応状況に状況に応じて、都合良い方でビルドされる。
(基本的には動的ライブラリの使用が優先される。優先度の変更はオプションで行える)