標籤:qt 發布 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)。現在右鍵菜單選擇“顯示包內容”,就會進到該目錄中。預設情況下,目錄結構如所示。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/72/79/wKioL1XkYNvyGSUlAADlnahKOaA867.jpg" title="01.png" alt="wKioL1XkYNvyGSUlAADlnahKOaA867.jpg" />
在MacOS目錄中的CoderQuestion1其實就是可執行檔,其他目錄中是資源檔。很顯然,這樣的目錄結構太單薄了,複製到其他OS X系統上,很難保證其成功運行。
那麼我們應該怎麼辦呢?廢話,當然是複製相關的檔案到這個Bundle了。那麼我們怎麼知道應該複製什麼檔案呢?其實使用otool工具很容易做到這一點。現在通過Console進入Bundle中的MacOS目錄,然後執行下面的命令。
otool -LCoderQuestion1
執行折行命令後,會顯示如的資訊。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/72/79/wKioL1XkYaqQyHVzAA8oWxtauu0170.jpg" width="600" height="331" alt="wKioL1XkYaqQyHVzAA8oWxtauu0170.jpg" />
儘管這裡列出了需要的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檔案,這樣看起來更酷。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/72/7C/wKiom1XkX8izREcZAAR3H_JMzXk219.jpg" width="500" height="893" alt="wKiom1XkX8izREcZAAR3H_JMzXk219.jpg" />
OK,現在我們來看看QTfor Windows應用是如何打包的。Windows下的QT也有類似於macdeployqt的工具,不過叫windeployqt.exe,位於如下的目錄中。
C:\Qt\Qt5.4.0\5.4\msvc2013_64_opengl\bin
儘管這是個命令列程式,但不要使用Windows的普通控制台進入該目錄,要使用QT的控制台,例如,本例使用的是Visual Studio2013版本的,所以應該使用黑框中的控制台。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/72/7C/wKiom1XkYBbQO18WAATPlHD9ycs472.jpg" width="500" height="568" alt="wKiom1XkYBbQO18WAATPlHD9ycs472.jpg" />
現在進入該控制台,將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的機器上無法運行。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/72/7C/wKiom1XkYFfA-CREAAUGjZV6180396.jpg" width="600" height="339" alt="wKiom1XkYFfA-CREAAUGjZV6180396.jpg" />
當然,還有更簡單的方法,就是直接複製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目錄的最後結構如所示。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/72/79/wKioL1XkYrKDbd5DAAQjbdPtRHI195.jpg" width="600" height="357" alt="wKioL1XkYrKDbd5DAAQjbdPtRHI195.jpg" />
本文出自 “李寧的極客世界” 部落格,請務必保留此出處http://androidguy.blog.51cto.com/974126/1690306
QT5.x應用在Mac OS X和Windows平台的發布過程