2012/12/28

Macのdylibとsoの違い

MacというかMach-OはLinuxとかのELFと違っててshared libraryは2種類あって
.dylibと.bundle(決まってない.soがLinuxライブラリとのporting目的で使われる事が多いらしい)とあるらしい。

感覚的によく使うのは(-lオプションを使う)dylibな感じなんだが、
結局どう違うのかいまいちわかってなかったので調べてみた。

以下から

http://stackoverflow.com/questions/2339679/what-are-the-differences-between-so-and-dylib-on-osx

dylibはsharead library、.bundleはloadable module

dylibは-lを使ってリンクするライブラリでunloadできない。
.bundle(.so)は-lは使えない。unloadできる。が大きく違うといってる。



[自分用メモ] 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

という感じ。



2012/12/24

[自分メモ] Qt DesignerでWidget/Layoutをウインドウサイズにあわせて伸縮

まず、伸縮させたいWidgetのSizePolicyをExpandingにする。

その後に、centralWidget(QMainWindow直下のWidget)の領域で
右クリック → レイアウト → 水平に並べる or 垂直に並べる or Gridに並べるを
選ぶとcentralWidget直下のWidget/Layout達が整列される。

Expandingにするだけじゃダメだった・・。

参考サイト
http://stackoverflow.com/questions/3492739/auto-expanding-layout-with-qt-designer

[自分メモ] qwtのビルド時にld: library not found for -lqwtでエラー

Mac(10.8)上でqwt-6.0.2をビルドするときに発生する。


linking ../../lib/qwtmathml.framework/qwtmathml
ld: library not found for -lqwt

のようなエラーで止まってしまう場合。

qwtconfig.priの以下の部分をコメントアウトする。

修正前


macx:CONFIG(qt_framework, qt_framework|qt_no_framework) {

    QWT_CONFIG += QwtFramework
}

修正後

#macx:CONFIG(qt_framework, qt_framework|qt_no_framework) {
#
#    QWT_CONFIG += QwtFramework
#}

ここの部分は.proファイルにqtAddLibraryとかで追記する事で、
qwtライブラリ自体をVisualStudioで言うところのプロジェクトファイルのように
追加するframeworkを作る際に設定するようなんだが、
これがなければ普通にdylibが作られるだけなのでオッにする。



[自分メモ] quazipのbuildでlinker error

Mac(10.8)上でquazip-0.5をbuildするとエラーになる場合の対処法。
zlibをlinkerオプションでくっつけ忘れているらしい。


 quazip-0.5/quazip/quazip.proの以下の部分を修正
修正前


unix:!symbian {
    headers.path=$$PREFIX/include/quazip
    headers.files=$$HEADERS
    target.path=$$PREFIX/lib
    INSTALLS += headers target

        OBJECTS_DIR=.obj
        MOC_DIR=.moc

}


修正後


unix:!symbian {
    headers.path=$$PREFIX/include/quazip
    headers.files=$$HEADERS
    target.path=$$PREFIX/lib
    INSTALLS += headers target
    LIBS += -lz

        OBJECTS_DIR=.obj
        MOC_DIR=.moc

}


LIBS += -lz を追記する。