Ruby C-APIのリンクでコケる on Mac

長らくrubyを触っていないので、もうC-APIの使い方が古いかもしれない。なんにせよ、以下のように問題が発生し、そして解決した。

自前のCライブラリをmake。そしてRuby C-APIでリンク。extconf.rbを使う。

% ruby extconf.rb --with-hoge-include=../src --with-hoge-lib=../src/.libs
% make

のようにして、普通にmakeしてこける。

compiling hoge.c
linking shared-object hoge.bundle
ld: warning: ignoring file ../src/.libs/libhoge.a, file was built for archive which is not the architecture being linked (i386): ../src/.libs/libhoge.a

メッセージを読んだ限りでは、archiveのarchitectureがi386でないとのこと。Macrubyi386か?ということで、MacPortのrubyを入れて解決。

% sudo port install ruby
% sudo port select ruby ruby18
% ruby extconf.rb --with-hoge-include=../src --with-hoge-lib=../src/.libs
checking for hoge.h... yes
checking for main() in -lhoge... yes
creating Makefile
% make
/usr/bin/clang -I. -I. -I/opt/local/lib/ruby/1.8/i686-darwin13 -I. -DHAVE_SPGLIB_H -I../src -I/opt/local/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE  -I/opt/local/include -fno-common -pipe -Os -arch x86_64  -fno-common -pipe -fno-common  -arch x86_64 -c hoge.c
/usr/bin/clang -dynamic -bundle -undefined suppress -flat_namespace -o hoge.bundle hoge.o -L. -L/opt/local/lib -L../src/.libs -L/opt/local/lib -L. -L/opt/local/lib -Wl,-headerpad_max_install_names -arch x86_64  -arch x86_64  -lruby -lhoge  -lpthread -ldl -lobjc

全然理解していないけど、動いた。よかった。

clangでCライブラリをmakeしたときは、dylibのパスをセットするためにLD_LIBRARY_PATHではなく、DYLD_LIBRARY_PATHをセットする。

export DYLD_LIBRARY_PATH=/foo/bar