読者です 読者をやめる 読者になる 読者になる

kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

BoostのMac用dylibのビルドで、install_nameを変更する

b2の引数等いろいろ調べたり試したりしたけど、ダメで、結局*.jamファイルを変更した。

Boost.Logを使おうと思ったところ、どうにもMacはstaticライブラリが使えないようで...Macでsharedライブラリを使用する場合install nameを相対にできないと、配布時に困ると思ったので調べてたけど、まあ、コレが難儀しまして。

方々調べて、どうもclang-darwin.jamなどでinstall_nameを指定してるっぽいことが分かったので、いじってみたらなんとかなりました。

あまりにスマートじゃないので、マジかって感じですが、他の手段もよくわからず。

clang-darwin.jamファイル

ダウンロードして解凍したboostフォルダの次のファイル。

boost_1_54_0/tools/build/v2/tools/clang-darwin.jam

GCCの場合はdarwin.jamと思われるけど、目的のBoost.LogはGCCでビルドできないので、選択の余地なし。

とかく、ファイル内をみると actions link.dll bind LIBRARIESの中で、-install_pathの記述があるので...

actions link.dll bind LIBRARIES
{
  ... -install_name "$(<[1]:D=)" ...
}

無理矢理変えます。

actions link.dll bind LIBRARIES
{
  ... -install_name "@executable_path/../libs/$(<[1]:D=)" ...
}

ビルドと確認

そいで、clangでビルド。logだけ。本来はprefix指定して、installまでしてしまいますが、諸事情により省略。clangビルドはこちらを参考にしました。

$ cd boost_1_54_0
$ ./bootstrap.sh --with-toolset=clang
$ ./b2 toolset=clang cxxflags="-std=c++11 -stdlib=libc++" linkflags="-stdlib=libc++" threading=multi --with-log

boost_1_54_0/stage/libsにできるので、otoolで調べてみます。

$ cd stage/lib
$ otool -D libboost_log.dylib 
libboost_log.dylib:
@executable_path/../libs/libboost_log.dylib

うまいこと変わってます。-Lでみてもいい感じに。

$ otool -L libboost_log.dylib 
libboost_log.dylib:
	@executable_path/../libs/libboost_log.dylib (compatibility version 0.0.0, current version 0.0.0)
	@executable_path/../libs/libboost_chrono.dylib (compatibility version 0.0.0, current version 0.0.0)
	@executable_path/../libs/libboost_thread.dylib (compatibility version 0.0.0, current version 0.0.0)
	@executable_path/../libs/libboost_filesystem.dylib (compatibility version 0.0.0, current version 0.0.0)
	@executable_path/../libs/libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
	@executable_path/../libs/libboost_date_time.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 28.4.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

Xcodeでサンプルを作ってみたところ、意図通りに動作。これでようやく使えるかな。