アプリをビルドして .appをまるごとコピーしたはいいものの、別環境だと動かないというときの解決法
結論
アプリが依存しているQtのフレームワークをコピーしてきて、install_name_tool
で参照先を書き換えて一緒にバンドルする
2013/12/17追記:macdeployqt
というSDKに付属のコマンドを使うのがシンプルで良さそうです。教えて頂いた @shimacpyon さんありがとうございました。
手順
以下、macdeployqtを使わずマニュアルでする方法
1. otoolでアプリが使用している共有ライブラリを調べる
hoge.app/Contents/MacOS/ に移動して、アプリ本体のバイナリに対して以下
otool -L hoge
大体以下のようなQtライブラリが見つかる
/Applications/Qt/5.1.1/clang_64/lib/QtGui.framework/Versions/5/QtGui (compatibility version 5.1.0, current version 5.1.1)
/Applications/Qt/5.1.1/clang_64/lib/QtCore.framework/Versions/5/QtCore (compatibility version 5.1.0, current version 5.1.1)
他の環境にコピーしたとき、上記パスにQtがない場合は動かないので、フレームワークをバンドルしてパスを書き換える必要がある
2. install_name_toolでフレームワークの参照先を変更
例えば、hoge.app/Contents/Frameworks
というディレクトリを作って、上記のフレームワークをコピーする。そして、バイナリファイルに対して以下のコマンド
install_name_tool -change "/Applications/Qt/5.1.1/clang_64/lib/QtGui.framework/Versions/5/QtGui" "@executable_path/../Frameworks/QtGui" hoge
install_name_tool -change "/Applications/Qt/5.1.1/clang_64/lib/QtCore.framework/Versions/5/QtCore" "@executable_path/../Frameworks/QtCore" hoge
@executable_path
というのは、バイナリファイルのパスのこと。これで.app内にコピーしたライブラリを参照してくれるので、別の環境にコピーしても動く。
3. アプリ配布
.appフォルダ毎コピればおk。
いじょう、簡単だけどめんどくさいです。
書いてから思ったけど、QtにかぎらずMacで共有ライブラリを使ったアプリを配布する際の話でした
windowsの場合
QtCore.dll、QtGui.dllとかライブラリをexeと一緒のフォルダに入れておけばOK