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


參考:https://blog.51cto.com/androidguy/1690306

QT是一款非常牛逼的跨平台開發工具,目前可以開發Mac OS XWindowsLinuxAndroidiOS等平台的App。對於AndroidiOS平台,發布相對容易,例如,Android平台是生成apk文件上傳到Android設備的,所以直接安裝apk文件即可。不過對於PC平台(Mac OS XWindowsLinux)的應用,在發布時就顯得麻煩些。

本文主要介紹Mac OS XWindows平台的發布過程。這兩個平台運行的應用都稱為可執行程序。Windows平台可執行文件擴展名是exeMac 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)。現在右鍵菜單選擇“顯示包內容”,就會進到該目錄中。默認情況下,目錄結構如下圖所示。

wKioL1XkYNvyGSUlAADlnahKOaA867.jpg

 

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

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

otool -LCoderQuestion1

執行折行命令后,會顯示如下圖的信息。


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文件,這樣看起來更酷。

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版本的,所以應該使用下圖黑框中的控制台。

wKiom1XkYBbQO18WAATPlHD9ycs472.jpg

現在進入該控制台,將QT生成的exe文件(本例是CoderQuestion1.exe)復制到其他目錄(例如,d:\release),並執行下面的命令。

windeployqtd:\release\CoderQuestion1.exe

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

一種方法是可以使用相關的工具查看,可以使用DependencyWalker,這是一款可跨平台的工具,可以查看Windows中的exedll等二進制文件的依賴。大家可以上網去下載這款工具。例如,用該工具打開CoderQuestion1.exe,會發現除了QTdll外,還有兩個VSdllMSVCP120.DLLMSVCR120.DLL)。讀者可以在VS的安裝目錄搜索這兩個文件。不過要注意,選擇64位或32位的dll(將這兩個文件復制到d:\release目錄中),不要選擇ARM處理器的同名dll,否則在x86的機器上無法運行。

wKiom1XkYFfA-CREAAUGjZV6180396.jpg

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

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

 

里面只有3dll文件,其中兩個就是前面通過DependencyWalker工具找到的文件。現在將這3個文件復制到d:\release目錄即可。OK,現在將release目錄復制到任何Windows機器上(必須是64位系統),就都可以運行了。即使沒有安裝VS2013QT也一樣。

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

 

wKioL1XkYrKDbd5DAAQjbdPtRHI195.jpg

 

使用webengine開發的程序 如果使用windeployqt 打包后無法運行。就把 文件A 放入到和windeployqt同一個文件夾 然后返回上一層。復制windeployqt文件夾 重命名進入文件夾 刪除所有文件 只留 文件A 然后再執行windeployqt就可以了 這應該是qt的bug


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM