Macの共有ライブラリには,インストール先の情報が記録される.インストール先は,-install_nameの指定があればそのディレクトリ,なければ-oで指定したものが使われる.ライブラリのinstall nameは,これをリンクしたライブラリやバイナリに転写されていく.
-install_nameの後はスペース.=を入れると正しく動作しないので注意.
オブジェクトファイルに関する情報は,otoolで表示することができる. ライブラリの名前とバージョン,リンクしているオブジェクトやライブラリを表示するには,
$ otool -L ライブラリまたはバイナリ
ライブラリのinstall nameを表示するには,
$ otool -D ライブラリ
を使う.
共有ライブラリのinstall nameの変更は,install_name_toolを使う.
$ install_name_tool -id 新しいパス
でできる.ライブラリやバイナリに書き込まれた他のライブラリのinstall nameを変更するには,
$ install_name_tool -change 古いパス 新しいパス
とする.
多くのフリーウェアでは,libtool
がこのあたりの面倒を見てくれるが,シェルスクリプトやGNU Makeを駆使して機種依存の問題を解消しようとしているものもある.
vaporは,configure
の変わりにoptions.mk
, site.mk
を手動で編集したり,機種依存のインクルードファイル(例: Darwin.mk
)を用意している.ライブラリには,生成したディレクトリのパスがinstall_name
として記録されているため,うまく動作しない.DYLD_LIBRARY_PATH
を設定してライブラリを見つけようとしている.既定の-two_levelnamespace
だとコマンドラインと共有ライブラリに記録されたパスしか検索しないので,ライブラリは見つからない.
make/config/Darwin.mk
のSHARED_LDFLAGS
に-install_name
を指定して対処.