天天看點

QT5.x應用在Mac OS X和Windows平台的釋出過程

QT是一款非常牛逼的跨平台開發工具,目前可以開發Mac OS X、Windows、Linux、Android、iOS等平台的App。對于Android和iOS平台,釋出相對容易,例如,Android平台是生成apk檔案上傳到Android裝置的,是以直接安裝apk檔案即可。不過對于PC平台(Mac OS X、Windows和Linux)的應用,在釋出時就顯得麻煩些。

本文主要介紹Mac OS X和Windows平台的釋出過程。這兩個平台運作的應用都稱為可執行程式。Windows平台可執行檔案擴充名是exe。Mac OS X平台可執行檔案通常沒有擴充名,不過标準的Mac OS X執行程式并不隻有一個檔案,而是一個Bundle。什麼是Bundle呢?其實就是一個包含了各種必要檔案的目錄。在Mac OS X的應用程式中都是這種東西。大家可以選擇一個程式,單擊滑鼠右鍵,點選“顯示包内容”,就可以看到該應用程式Bundle的目錄結構。

下面先看看QT5 for Mac OS X的應用如何釋出。可能有的同學會認為,直接将QT生成的Bundle複制到其他OS X系統上運作不就行了嗎?其實,這麼做是不行的,因為QT生成的Bundle之是以可以在QT中運作,是因為本機相關的Library都存在,而且QT知道這些家夥在哪裡(當然,肯定不在Bundle中)。而要是将Bundle複制到其他OS X系統中,如果未安裝QT,将無法找到這些Library。是以自然無法運作了。

那麼該怎麼辦呢?實際有兩種方法:靜态編譯和動态編譯。

靜态編譯顧名思義,就是将所有的Library都編譯進可執行檔案。這麼做固然很友善。不過當應用非常大時,編譯的時間可能比較長,而且生成的可執行檔案會很大。當然,還有更大的問題,從官網上下載下傳的QT都是動态編譯版本的,要想靜态編譯,需要自己重新用靜态的方式編譯整個QT,時間比較長,編譯完成後大約2GB左右。當然,如果打算這麼做的同學,就不用往後面看了,感覺下載下傳QT源代碼,然後編譯吧。

現在說一下動态編譯的過程。如果從官網上下載下傳的安裝版QT,都是動态編譯版本的,也就是說,生成的可執行檔案不能獨立執行。

大家可以用QT随便建立和編譯一個工程,然後編譯。假設工程名為CoderQuestion1,那麼預設的建構目錄如下:

/Users/lining/build-CoderQuestion1-Desktop_Qt_5_4_0_clang_64bit-Debug

進到該目錄,會看到有一個CoderQuestion1.app。這個并不是檔案,而是一個目錄,隻是OS X系統看到某個目錄的擴充名是app,就會将其認為是Bundle目錄,是以輕按兩下會直接執行(當然,必須要是真正的Bundle)。現在右鍵菜單選擇“顯示包内容”,就會進到該目錄中。預設情況下,目錄結構如下圖所示。

<a href="http://s3.51cto.com/wyfs02/M02/72/79/wKioL1XkYNvyGSUlAADlnahKOaA867.jpg" target="_blank"></a>

在MacOS目錄中的CoderQuestion1其實就是可執行檔案,其他目錄中是資源檔案。很顯然,這樣的目錄結構太單薄了,複制到其他OS X系統上,很難保證其成功運作。

那麼我們應該怎麼辦呢?廢話,當然是複制相關的檔案到這個Bundle了。那麼我們怎麼知道應該複制什麼檔案呢?其實使用otool工具很容易做到這一點。現在通過Console進入Bundle中的MacOS目錄,然後執行下面的指令。

otool -LCoderQuestion1

執行折行指令後,會顯示如下圖的資訊。

盡管這裡列出了需要的Library,不過一個一個複制太麻煩,而且初學者估計不知道應該複制到Bundle中的哪個子目錄。當然,光複制這些内容也是不行的,還需要做一些其他的工作,總之,通過手工處理這些工太麻煩。

幸好QT提供了一個非常友善的打包工具macdeployqt,該檔案位于如下目錄。

/Users/lining/Qt5.4.0/5.4/clang_64/bin

為了友善,可以将這個目錄加入到PATH環境變量中。

現在隻需要執行如下的指令,系統就會自動該着Bundle,把相關的檔案和目錄都放到Bundle中的相關位置。

macdeployqt CoderQuestion1.app

不過一定要注意,要将CoderQuestion1.app複制一份,用macdeployqt處理這個拷貝。因為如果你處理原來的Bundle,有可能會造成源代碼編譯問題。

處理完後,Bundle的目錄結構如下圖,很明顯,macdeployqt指令将相關檔案和目錄都放到了Bundle中。現在将這個處理完的CoderQuestion1.app複制到任何OS X系統上都可以運作了,無論安裝沒安裝QT,都可以運作。當然,還可以将其打包成dmg檔案,這樣看起來更酷。

OK,現在我們來看看QTfor Windows應用是如何打包的。Windows下的QT也有類似于macdeployqt的工具,不過叫windeployqt.exe,位于如下的目錄中。

C:\Qt\Qt5.4.0\5.4\msvc2013_64_opengl\bin

盡管這是個指令行程式,但不要使用Windows的普通控制台進入該目錄,要使用QT的控制台,例如,本例使用的是Visual Studio2013版本的,是以應該使用下圖黑框中的控制台。

現在進入該控制台,将QT生成的exe檔案(本例是CoderQuestion1.exe)複制到其他目錄(例如,d:\release),并執行下面的指令。

windeployqtd:\release\CoderQuestion1.exe

執行這行指令後,系統就會将相關的檔案和目錄放到d:\release目錄中。不過這時放到其他Windows系統中,如果未安裝Visual Studio2013,仍然是運作不了。這是因為還缺少Visual Studio2013的相關的Library。那麼怎麼知道缺少哪些Library呢?

一種方法是可以使用相關的工具檢視,可以使用DependencyWalker,這是一款可跨平台的工具,可以檢視Windows中的exe、dll等二進制檔案的依賴。大家可以上網去下載下傳這款工具。例如,用該工具打開CoderQuestion1.exe,會發現除了QT的dll外,還有兩個VS的dll(MSVCP120.DLL和MSVCR120.DLL)。讀者可以在VS的安裝目錄搜尋這兩個檔案。不過要注意,選擇64位或32位的dll(将這兩個檔案複制到d:\release目錄中),不要選擇ARM處理器的同名dll,否則在x86的機器上無法運作。

當然,還有更簡單的方法,就是直接複制VS的運作時,大家可以都按如下的目錄找到VS2013的運作時。如果是32位系統,需要将x64換成x86。

C:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT

裡面隻有3個dll檔案,其中兩個就是前面通過DependencyWalker工具找到的檔案。現在将這3個檔案複制到d:\release目錄即可。OK,現在将release目錄複制到任何Windows機器上(必須是64位系統),就都可以運作了。即使沒有安裝VS2013和QT也一樣。

如果大家使用的是32位Windows,需要在32位機器上安裝32位的QT版本,重新編譯,并複制VS2013中32位的dll即可。d:\release目錄的最後結構如下圖所示。

 本文轉自 androidguy 51CTO部落格,原文連結:http://blog.51cto.com/androidguy/1690306,如需轉載請自行聯系原作者

繼續閱讀