xmake從入門到精通6:開發和構建Qt程序

  • 2019 年 12 月 4 日
  • 筆記

xmake是一個基於Lua的輕量級現代化c/c++的項目構建工具,主要特點是:語法簡單易上手,提供更加可讀的項目維護,實現跨平台行為一致的構建體驗。

xmake完全支持對Qt5項目的維護和構建,通過本文將會帶你了解如何通過xmake來維護各種類型的Qt項目。

  • 項目源碼
  • 官方文檔

前言

Qt是一個1991年由Qt Company開發的跨平台C++圖形用戶界面應用程序開發框架。它有自己的IDE程序:qt creator,也有自己的構建程序:qmake,似乎新版本開始打算全面切到cmake來維護了。

儘管如此,xmake還是對Qt的開發做了支持,搭配上xmake-vscode/xmake-idea等插件,使用戶可以在自己熟悉的編輯器和IDE上集成和開發Qt程序,並且在不同平台上提供一致的開發體驗。

準備構建環境

首先,我們得準備好Qt開發環境,如果還沒安裝Qt SDK,那麼到qt的官網登錄下載安裝包:https://www.qt.io/,或者自己拉取qt源碼,編譯靜態版本sdk和工具鏈。

通常情況,如果是採用官方提供的QT SDK安裝包,並且安裝目錄採用的默認路徑,那麼即使不配置QT SDK路徑,xmake也會嘗試去檢測它,一般都是能檢測到的,如果檢測不到,我們可以嘗試手動配置下它:

$ xmake f --qt=/home/xxx/qtsdk

或者設置到全局路徑,避免每次編譯切換都要配置一遍:

$ xmake g --qt=/home/xxx/qtsdk

創建模板工程

xmake內置了各種Qt項目的空工程模板,我們可以通過xmake create命令來快速創建它們。

註:由於xmake的master最新版本,也就是還未發佈的v2.2.9版本對Qt的模板和構建規則進行了升級,因此本文主要講解的都是基於最新版本來講解, 而之前的老模版和規則也是向下兼容的,如果想要繼續了解,可以查看相關文檔:Qt項目開發文檔

創建QuickApp應用程序

我們先來創建一個帶qml的quickapp空工程,只需要敲如下命令:

$ xmake create -t qt.quickapp test  create test ...    [+]: xmake.lua    [+]: src/main.qml    [+]: src/main.cpp    [+]: src/qml.qrc    [+]: .gitignore  create ok!

xmake會生成帶有xmake.lua的Qt項目,xmake.lua內容也很簡單:

target("test")      add_rules("qt.quickapp")      add_headerfiles("src/*.h")      add_files("src/*.cpp")      add_files("src/qml.qrc")

除了源文件的添加,其他基本上都跟之前的可執行程序項目沒什麼不同,唯一的區別就是通過add_rules("qt.quickapp")這個內置的Qt構建規則來代替set_kind("binary")

其實qt.quickapp規則內部最終還是設置了binary類型,只不過在此基礎上額外增加了一些只有Qt才需要的構建規則,比如:特定links,flags還有includedirs等。

接下來,我們嘗試編譯下這個項目:

$ xmake  checking for the architecture ... x86_64  checking for the Xcode directory ... /Applications/Xcode.app  checking for the SDK version of Xcode ... 10.15  checking for the Qt SDK directory ... /Users/ruki/Qt5.13.2/5.13.2/clang_64  checking for the Qt SDK version ... 5.13.2  [  0%]: ccache compiling.release src/main.cpp  [ 49%]: compiling.qt.qrc src/qml.qrc  [100%]: linking.release test

其中*.qrc文件的構建規則也是在qt.quickapp的構建規則裏面維護的,所以只有設置了這個rule,才能正常編譯qrc文件。

最後,我們嘗試運行下看看:

$ xmake run

運行效果如下:

創建WidgetApp應用程序

創建一個widgetapp工程跟上文的quickapp方式基本一致,只需要改下模板名即可:

$ xmake create -t qt.widgetapp test

裏面xmake.lua的內容看起來,也僅僅就是把qt.quickapp規則改成了qt.widgetapp規則,另外,ui描述文件從.qrc變成了.ui,其他並無區別。

target("qt_widgetapp")      add_rules("qt.widgetapp")      add_files("src/*.cpp")      add_files("src/mainwindow.ui")      add_files("src/mainwindow.h")  -- 添加帶有 Q_OBJECT 的meta頭文件

運行效果如下:

創建靜態鏈接版本應用程序

默認通過qt官網下載的sdk,都是基於動態庫的,如果用戶用的是自己拉取qt源碼然後編譯的static版本qt sdk,那麼創建的qt工程類型也必須對應static版本,因為兩者來處理鏈接上會有不同的邏輯。

對於模板名,後面追加下_static來創建:

$ xmake create -t qt.widgetapp_static test

創建的就是基於靜態QtSdk的WidgetApp工程,其裏面的構建規則,也會改成add_rules("qt.widgetapp_static"),其他並無不同,QuickApp項目也是如此。

創建其他Qt項目

除了QuickApp和WidgetApp項目,xmake還支持其他Qt項目的創建和編譯,比如:終端程序,基於Qt的靜態庫和動態庫等。

具體的工程模板,我們可以進入help菜單查看裏面的模板列表:

$ xmake create --help  Usage: $xmake create [options] [target]    Create a new project.    Options:      -t TEMPLATE, --template=TEMPLATE       Select the project template id or                                             name of the given language.                                             (default: console)                                                 - console: c++, go, dlang, cuda,                                             rust, swift, objc, c, objc++                                                 - qt.console: c++                                                 - qt.quickapp: c++                                                 - qt.quickapp_static: c++                                                 - qt.shared: c++                                                 - qt.static: c++                                                 - qt.widgetapp: c++                                                 - qt.widgetapp_static: c++

更多其他Qt項目的使用說明,可以查看xmake的官方文檔:Qt項目構建文檔

運行和斷點調試

我們可以通過xmake run -d命令來加載gdb/lldb調試程序,或者搭配xmake-vscode插件的斷點調試支持,來開發和調試Qt程序。 這塊可以閱讀前文:xmake從入門到精通3:運行和調試目標程序

另外,如果是win平台,我們也可以通過生成vs proj,然後通過vs自帶的調試功能,進行斷點調試,更加方便:

$ xmake project -k vsxmake

生成基於xmake的vs工程後,打開vs工程,點擊調試運行即可:

開發Android程序

xmake目前是完全支持編譯Android版本的Qt項目,整個Qt項目包括xmake.lua完全跟前面的例子一致,並不需要做特別的設置。

我們需要做的僅僅是,切換到android的編譯平台去編譯它,不過由於要生成apk包,在執行xmake編譯後,qt構建規則會自動對android程序做一個部署deploy步驟,也就是調用qt內部的androiddeployqt程序去生成apk包。

因此除了需要android ndk,我們還需要額外依賴android sdk,通過設置--android_sdk參數對其指定下:

$ xmake f -p android --ndk=~/Downloads/android-ndk-r19c/ --android_sdk=~/Library/Android/sdk/ -c  $ xmake  [  0%]: compiling.qt.qrc src/qml.qrc  [ 50%]: ccache compiling.release src/main.cpp  [100%]: linking.release libappdemo.so  [100%]: generating.qt.app appdemo.apk

上面的配置和構建過程就可以很方便的將之前的QuickApp和WidgetApp項目編譯成Android App,另外qt規則內部還對android版本定製了install程序,可以很方便的安裝qt apk到設備。

$ xmake install  installing appdemo ...  installing build/android/armv7-a/release/appdemo.apk ..  success  install ok!

安裝和運行後的效果如下:

關於如何配置Android編譯環境,可閱讀前文:xmake從入門到精通5:Android平台編譯詳解

編輯器和IDE集成

xmake也提供了對各大常用編輯器的插件集成支持,配合這些插件,就可以在自己最熟悉的編輯器上開發和構建Qt程序。

在vscode上開發和調試Qt程序

插件地址:xmake-vscode

在Sublime Text上開發Qt程序

插件地址:xmake-sublime

在Idea/CLion/Android Studio上開發Qt程序

插件地址:xmake-idea

在VisualStudio裏面開發和調試Qt程序

也就是剛上面提到的通過生成vs proj方式來集成xmake:

$ xmake project -k vsxmake

生成基於xmake的vs工程後,打開vs工程,點擊調試運行即可:

這塊,具體詳情,可以查看插件文檔:使用xmake生成vs工程