例えば、MacPorts で GCC 4.7 をインストールすると libstdc++.6.dylib がついてくるんですが、64-bit な RawTherapee をビルドビルドすると glib に未定義なシンボルがある?ようで weak link になっちゃいます。
Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 X86_64 ALL LIB64 EXECUTE 53 5128 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK
で、「ウィークリンクやめてよー」ってことで g++-mp-4.7 に -fno-weak
を使ってコンパイルすると…
Undefined symbols for architecture x86_64: "Glib::Value<rtengine::procparams::ProcParams>::custom_type_", referenced from: Glib::Value<rtengine::procparams::ProcParams>::value_type() in history.cc.o "Glib::Value<rtengine::ProcEvent>::custom_type_", referenced from: Glib::Value<rtengine::ProcEvent>::value_type() in history.cc.o "Glib::Value<ParamsEdited>::custom_type_", referenced from: Glib::Value<ParamsEdited>::value_type() in history.cc.o ld: symbol(s) not found for architecture x86_64
ぐぬぬ…。
あとこれだけ解決できればうまくいきそうなんだけどなー。RT の問題なんだか glib の問題なんだかわからん。
とりあえず現状は、
-Wl,-weak_library,/usr/lib/libstdc++.6.dylib
という感じでシステムの libstdc++ を先読みさせて対処してます(/usr/lib/libstdc++.6.dylib を /opt/local/lib/libstdc++.6.dylib より先に読ませればいいだけなので -weak_library
なしでもいいんですけど。)。別の方法としては、
-static-libstdc++ -Wl,-lstdc++-static -Wl,-lazy-lstdc++
っていう方法があって、とりあえずシステムの libstdc++ を静的リンクして、MacPorts の GCC が使ってる libstdc++ は -lazy-l
で必要になるときまで呼び出さないことで回避できます。あとは実行時に DYLD_LIBRARY_PATH
で強制するか、-flat_namespace
使って DYLD_INSERT_LIBRARIES
で割り込みさせるかでしょうか。
とりあえず他のシステムでも動いているのでよしとしよう。