仕事の方で C++ でコードを書いている。
C++ のクラスの中で機能を実装していくのは楽しいんだが、いざそのコードを使ってちょろっと計算しようという時 main() を書き換えてはコンパイルし直しというのがだんだん面倒になって来た。
同僚が SWIG というのを使っていたので、これを使えば実装は C++ でがりがり書いて、メインの方は python あたりをコンソールにして、インタラクティブにあれこれできるぜって期待したんだが甘かった。
swig を利用するにはあらかじめ C/C++ のコードの方は shared object にして、スクリプト言語の方から import できるようにしておかなければならない。
で、 Mac OSX の gcc には -shared がなかったんだな、これが。
散々悩んだが、最後にswig の wiki に -dynamic -bundle -bundle_loader を組み合わせる方法を見つけてなんとか解決。
問題は IBM の xlc でコンパイルする時なんだよなぁ…。
-qmkshrobj という、それっぽいオプションはあるんだが、リンクの段階で Undefined symbols が出て蹴られてしまう。なんで gcc は回避できて xlc だとできないんだ。
-qmkshrobj の時は ld じゃなく libtool が呼ばれるという記述を発見。だからこれを外して -bundle -bundle_loader hoge すると gcc の時同様ちゃんと渡ることは判った。
次はこれか
/usr/bin/ld: hogehoge_wrap.o has local relocation entries in non-writable section (__TEXT,__text)
答えは、 ld に -read-only-relocs warning を渡してエラーじゃなく warning にしてしまう。そのためのオプションはこうなる
-Wl,-read_only_relocs,warning
[referer:
The script did not produce proper HTTP headers. Please see the error log to see the detail of the errors. Depending on the server configuration, you can also run thisscript under CGIWrap debugging. Usually, either rename or linkthe script temporarily to a file which ends with .cgidextension, or add a AddHandler cgi-script-debug .cgiline to your .htaccess file.
]