mattintosh note

どこかのエンジニアモドキの備忘録

MacPorts GCC 4.x で libstdc++.6.dylib が競合?する

例えば、MacPortsGCC 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++ を静的リンクして、MacPortsGCC が使ってる libstdc++ は -lazy-l で必要になるときまで呼び出さないことで回避できます。あとは実行時に DYLD_LIBRARY_PATH で強制するか、-flat_namespace 使って DYLD_INSERT_LIBRARIES で割り込みさせるかでしょうか。

とりあえず他のシステムでも動いているのでよしとしよう。