Macにて gcc を使って動的共有ライブラリを作る の続きです。
libtool はソースコードから共有ライブラリを作成するための ツールプログラムです。
libtool manual: Linking static libraries
前回は、動的ライブラリを作った。 今回は、静的ライブラリを作る。
静的ライブラリと動的ライブラリの違い。
静的ライブラリとは、プログラムの作成時に組み込まれるタイプのもの。
動的ライブラリとは、プログラムの実行時にロードされるタイプのもの。
ライブラリについて解説!静的・動的とは?それぞれのメリットは
なお、Mac では、静的ライブラリと動的ライブラリがある場合は動的ライブラリが優先される。
前回と同様に下記の "Hello World" を出力する ソースコードを 静的ライブラリにする。
hello.c
void hello() { printf("Hello World \n"); }
(1) ソースファイルからオブジェクトファイルを作る。
% gcc -c hello.c - o hello.o
(2) オブジェクトファイルから静的ライブラリを作る。
下記のように staticオプションを追加してもダメ。
% gcc -shared -static hello.o - o libhello.a
下記のようなエラーになる。
Undefined symbols for architecture x86_64: "printf", referenced from: hello in hello.o
そこで libtool の出番です。
% libtool -c -static hello.o - o libhello.a
これで静的ライブラリができる。
(3) 静的ライブラリをリンクして実行ファイルを作る。
% gcc main.c -lhello -o hello
(4) 実行ファイルの依存するライブラリを確認する。
% otool -l hello
name /usr/lib/dyld
name /usr/lib/libSystem.B.dylib
動的ライブラリのときは、 libhello が入っていたが、それがなくなった。
libSystem.B.dylib が含まれている。
ちゃんとした静的ライブラリを作るには、 C言語の基本ライブラリ自体に静的ライブラリを選択する必要がある。
Linux では glibc-static というライブラリがあるが、 Mac には相当するものがない。
CentOS 6.4 で glibc をスタティックリンクする方法
サンプルコードを Github に公開した。 https://github.com/ohwada/MAC_cpp_Samples/tree/master/make/static_lib