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)

としたら、うまくできた。

さらに、同じソースでLinuxMacOSで使えるように、
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
に追加する。