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でないとのこと。Macのrubyがi386か?ということで、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