前言:
從事qt開發已經好幾年了,但有關pro編寫的一些細節問題一直沒有一個很好的梳理匯總——因為實際工作開發中,往往只需要編譯特定版本的軟件(例如32位release版本),項目創建好后并設置好編譯路徑,并且庫鏈接不出錯,程序能跑起來后,后續只需要進行代碼開發和升級就好了。
然而,隨著開發需求越來越多,首先單個項目用到的庫非常多,并且各種版本,兼容32/64位的庫,往往會把pro文件搞得很亂,而一旦需要從32位更換64位,又想換成debug模式的話,往往編譯出幾百個錯誤,大多都是庫鏈接不上的問題,這個時候問題排查可能就很耗費時間,也很讓人崩潰( LNK2001: 無法解析的外部符號這種編譯報錯,沒有給出真正的原因,總是讓人很暴躁崩潰)
總而言之,進行qt開發的時候,pro文件兼容debug/release,支持32位/64位,這樣會比較方便,而且也是一個好習慣。某些軟件在最終打包安裝的時候,也可以提供給用戶自由選擇安裝的版本。
理論上,pro文件中也可以區分安卓、linux甚至ios的方法,不需要重復注釋代碼段的。以下只是Windows的區分,以后如果有其他開發,再補充吧。
pro代碼:
win32{
contains(QT_ARCH, x86_64){#64位
# message("64-bit")#Module1win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build_64/xxx/xxx/release/ -lxxxelse:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build_64/xxx/xxx/debug/ -lxxx#Module2LIBS += -L$$PWD/../xxx/xxx/x64/ -lxxxINCLUDEPATH += $$PWD/../xxx/xxx/}else{#32位
# message("32-bit")#Module1win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build/xxx/xxx/release/ -lxxxelse:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build/xxx/xxx/debug/ -lxxx#Module2LIBS += -L$$PWD/../xxx/xxx/x86/ -lxxxINCLUDEPATH += $$PWD/../xxx/xxx/
}
}
1.win32{ },就是Windows平臺嘛,如果是linux就是unix{ },只要將代碼包起來,在對應平臺編譯就不會跑其他的代碼
2.contains(QT_ARCH, x86_64){
}else{ }
這是32/64位的區別,x86_64是64位,else就是32位了
3.win32:CONFIG(release, debug|release): …
else:win32:CONFIG(debug, debug|release):…
這個就是debug和release的區分,可以將對應lib的鏈接寫在這里,一般來說路徑都不會不一樣
4.生成路徑
win32:CONFIG(release, debug|release): DESTDIR = ../bin_moduleProjectMain/Release
else:win32:CONFIG(debug, debug|release): DESTDIR = ../bin_moduleProjectMain/Debug
這樣設置,能在debug和release的不同模式下,將執行文件exe分別輸出到不同的目錄下,不會混淆。值得一提的是,如果沒有設置DESTDIR ,默認執行文件時被放到build目錄下的,雖然也有debug/release的區分,但會有一大堆moc,obj這些多余的生成文件,對程序運行沒有用處,所以要將bin和build目錄區分開來。
至于編譯路徑build,直接在qt-項目-構建目錄,設置就好了,上述DESTDIR 的“…/xxx”也是基于這個目錄進行返回上一級的
個人比較推薦,在我們的工程目錄底下,分為三個文件夾,分別是工程代碼、build編譯中間文件、bin輸出文件,除此之外還可以加readme說明,還有參考文檔,第三方庫等文件夾
5.執行文件打包
如果按照我以上的步驟編譯,最終bin中一般只有三個文件,其中exe是最主要的,也是最終的執行文件。那么,如果在qt中直接運行,當然可以把程序跑起來,可在bin目錄中直接點擊exe,就會缺少庫了。
首先,我們需要補充qt的庫,那么qt有一個良好的打包功能,一般來說,點擊開始菜單-Qt 5.14.2-Qt 5.14.2 (MSVC 2017 32-bit),我們需要用這個工具進行打包。(如果是64位的話要選擇對應的那個,不然最終exe是跑不起來的!!!)
然后,cd移動到exe所在的文件夾,然后輸入windeployqt xxx.exe,工具就會幫你自動補全qt相關的所有庫了。(注意,有極個別的庫可能會缺漏,比如opengl啊那些,也不知道是不是我個人的問題。如果缺少,大家可以在qt安裝目錄下把dll找出來,復制進去即可)
除此之外,當然是需要將我們的第三方庫復制進去了,這個具體情況按照自己的來。
不過即便如此,你的程序也有可能在其他電腦中跑不起來哦,可能缺少一些vc庫什么的。這里我建議安裝包內內嵌一個vc庫打包合集什么的,用戶安裝的時候可以補全一下。又或者你自己復制補全進自己的文件夾里面,但是保不準出現在其他電腦上跑不起來的情況。
另外還可以加入內嵌的軟件啊,巴拉巴拉什么的,這里就不說了。