Homepage‎ > ‎

Distribute Qt App on Mac

posted Sep 16, 2012, 8:05 PM by YUEN WU   [ updated Sep 16, 2012, 9:13 PM ]
最近剛好有點時間透過 Qt 寫了一個小工具,想說來給別的 Mac 使用者使用,由於 Qt Creator 預設 release 程式的函數庫會用絕對路徑(Absolute Path)來連結,因此如果編譯出來的應用程式給別的 Mac 使用者使用是絕對不行的,因為他們大多數都沒有安裝 Qt 的 Library 。

那這個時候該怎麼辦呢?

當然,你也可以選擇使用 Static Link 的方式來轉發你的應用程式,這個部分我自己是沒有實際使用過,原因不外乎就是太麻煩了! 而且還要重新 Compile 函數庫,這就見仁見智了,有興趣的朋友可以再研究研究,本文章主要是討論動態連結的部分。

在 Windows 平台上,最常見的動態函數庫就是 DLL ,應用程式通常會去尋找執行目錄下的函數庫,因此只要把所用到的 DLL 移動到應用程式旁邊就可以了,但是在 Mac 上則不能這樣做,因為 Qt Creator 在 Mac 上會預設使用絕對路徑(第一段有提到)來連結函數庫,因此,我們必須使用 install_name_tool 和 otool 兩個程式來編輯我的函數庫引用的位置。

這又是一個噩夢的開始。

因為一個程式很少有機會只引用一個函數庫,如此一來,你必須使用 install_name_tool 來替換好幾次才能完成資料庫的連結,聰明的你或許想到寫 Shell Script 來做這件事情,但是人們就是因為想偷懶而進步,我開始尋找有沒有更快速方便的方法來完成這件事情,因為我們絕對不會是第一個人想到這件事情的。在 Qt 官方文件當中有一篇文章在介紹如何在 Mac 上開發應用程式( http://qt-project.org/doc/qt-4.8/deployment-mac.html ),裡面有提到,Qt SDK 在安裝的時候也一併安裝的一個小工具,macdeployqt,這程式在 $QTDIR/bin/macdeployqt 底下,我們可以透過它快速地佈署 Qt 的 Frameworks,只要透過指令

./macdeployqt yourapp.app 

就能夠一鑑完成動態函數庫(亦有Frameworks)的佈署。如此之方便你怎麼能不知道呢?

雖然他夠方便、夠聰明,但是他會把所有的函數庫、Frameworks、Plugins 都一併包進你的應用程式裡面,這樣應用程式就會變得很肥,這個時候如果你知道你自己用到哪間函數庫和 Frameworks,你就只要從 yourapp.app/Content/Frameworks/ 底下將不需要的 Frameworks 刪掉就可以了,是不是很簡單呢?
Comments