MacOSでダイナミックライブラリを作成する
Linuxで書いているプログラムをMacBookでコンパイルしてみたら
ラブラリを生成できなかった。
どうやら、MacOSではライブラリは.soではなく、.dylibらしい。
.dylibの作成には、オプションを
[-shared]から[-dynamiclib]に
[-soname]から[-install_name]に
変更すればよいらしい。
ということで、貰い物のMakefileに手を加えた。
具体的には
LIB_SO =lib$(PROGRAM).so $(LIB_SO) : $(OBJS) $(CC) $(LDFLAGS) \ -g -shared -Wl,-soname,$(LIB_SO) \ -o $(LIB_SO) \ $(OBJS) \ $(LIBRARIES)
となっている部分を
LIB_DYLIB =lib$(PROGRAM).dylib $(LIB_DYLIB) : $(OBJS) $(CC) $(LDFLAGS) \ -g -dynamiclib -install_name $(LIB_DYLIB) \ -o $(LIB_DYLIB) \ $(OBJS) \ $(LIBRARIES)
としたら、うまくできた。
さらに、同じソースでLinuxとMacOSで使えるように、
unameを使って条件分岐を書いてみた。
# OS OS = ${shell uname} # switch library ifeq ($(OS),Linux) # Linux all: $(LIB_SO) endif ifeq ($(OS),Darwin) # Darwin all: $(LIB_DYLIB) endif
これでOK
あれ?
ダメだ。上ではできないときもある。
なぜだ?
エラー解読中。
とりあえず
星の贈り物(2006年2月の日記)をみながら、
"-undefined suppress -flat_namespace"というのを追加して以下のようにしたら、.dylibができた。
LIB_DYLIB =lib$(PROGRAM).dylib $(LIB_DYLIB) : $(OBJS) $(CC) $(LDFLAGS) \ -g -dynamiclib -install_name $(LIB_DYLIB) \ -undefined suppress -flat_namespace -o $(LIB_DYLIB) \ $(OBJS) \ $(LIBRARIES)
しかし、いったい何をやっているのか、サッパリ分からん><
Makefileの書き方から、コンパイルオプションまで勉強せなあかんな。
DYLD_LIBRARY_PATH
最後に、.dylibのある場所を
DYLD_LIBRARY_PATH
に追加する。