2012/12/28

[自分用メモ] Deploying an (Qt) Application on MacのFramework

Mac用にQtアプリを作る場合はQtライブラリをMacのBundleという形式に従ってdeployしないといけない。

Bundleってのはザックリ言うとユーザに見えるMyApp.appっていうのがフォルダになってて、その中に実際の実行バイナリとかResourceとかshared libとかが含まれているというやつ。

まず、otoolを使って自分のアプリが使用するQtライブラリを確認する。

$cd MyApp.app/MacOX
$otool -L MyApp

ここでいうは実行バイナリ自信で、MyApp.app/MacOS/以下にある。

 /Developer/qt/4.8.3/lib/QtXml.framework/Versions/4/QtXml (compatibility version 4.8.0, current version 4.8.3)
 /Developer/qt/4.8.3/lib/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.3)
 /Developer/qt/4.8.3/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.3)

この辺が関係する。関係ない表示は省略
QtXmlとQtCoreとQtGuiが必要になるのでコピーする。
/Developer/qt/4.8.3/はQt SDKをインストールしたPath

$pwd
MyApp.app/MacOS
$cp -R  /Developer/qt/4.8.3/lib/QtCore.framework ../Frameworks/

という感じで-Rをつけてコピー。3つとも。

$otool -L ../Frameworks/QtCore.framework/Version/4/QtCore

/Developer/qt/4.8.3/lib/QtCore.framework/Versions/4/QtCore:
 /Developer/qt/4.8.3/lib/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.3)
(以下/usr/libやら/Systemやら)

この表示の2行目がframeworkのIDになるのでこれを変更する必要がある。

$install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore ../Frameworks/QtCore.framework/Versions/4/QtCore

2番目のライブラリのIDを1番目の文字列に変更するという意味らしい。

まずこれを今回だとQtCore, QtGui, QtXmlに対して行う。

次に、QtGuiとQtXml自体がQtCoreに依存している。

$otool -L ../Frameworks/QtGui.framework/Version/4/QtGui

./Frameworks/QtGui.framework/Versions/4/QtGui:
@executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.3)
/Developer/qt/4.8.3/lib/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.3)

こんな感じになってる。2行目のIDはinstall_name_toolで変わってるのが確認できる。3行目を変える必要がある。

3行目は以下のオプションで変える。

$install_name_tool -change /Developer/qt/4.8.3/lib/QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore ../Frameworks/QtGui.framework/Versions/4/QtGui

-changeの後の引数は3番目の引数のライブラリの、1番目の引数の依存ライブラリの文字列を、2番目の引数へ変更する。

という意味。

$otool -L ../Frameworks/QtGui.framework/Version/4/QtGui

../Frameworks/QtGui.framework/Versions/4/QtGui:
@executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.3)
@executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.3)

になってればOK。同じ事をQtXmlにやる。

で、最後に実行バイナリに対しても同じように依存ライブラリの変更をする。


$otool -L MyApp

 /Developer/qt/4.8.3/lib/QtXml.framework/Versions/4/QtXml (compatibility version 4.8.0, current version 4.8.3)
 /Developer/qt/4.8.3/lib/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.3)
 /Developer/qt/4.8.3/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.3)


$install_name_tool -change /Developer/qt/4.8.3/lib/QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore ../MacOS/MyApp

という感じ。



0 件のコメント: