xmake新增對Qt編譯環境支持

在最新的xmake v2.2.1版本中,新增了對Qt SDK環境的支持,我們完全可以脫離Qt Creater進行Qt應用程序的開發,甚至配合vscode/idea等編輯器+xmake插件(xmake-vscode, xmake-idea …),
用戶完全可以切換到自己最常用的編輯器環境中去開發和構建Qt程序,例如這樣:

通過模板創建空工程

xmake內置了一些工程模板可以用來快速創建一個基於Qt的空工程,例如:

$ xmake create -l c++ -t console_qt test
$ xmake create -l c++ -t static_qt test
$ xmake create -l c++ -t shared_qt test
$ xmake create -l c++ -t quickapp_qt test

目前主要提供上述四種工程模板,對應:控制檯程序、靜態庫、動態庫、ui應用程序。

以quickapp工程爲例,最後生成的空工程xmake.lua內容大概長這樣:

target("qt_demo")

    -- add rules
    add_rules("qt.application")

    -- add headers
    add_headers("src/*.h")

    -- add files
    add_files("src/*.cpp") 
    add_files("src/qml.qrc")

    -- add frameworks
    add_frameworks("QtQuick")

Qt SDK環境配置

默認情況下xmake會自動探測Qt環境,當然如果找不到Qt SDK環境,用戶也可以手動指定Qt SDK環境目錄:

$ xmake f --qt=~/Qt/Qt5.9.1
靜態庫程序

xmake通過內置的構建規則qt.static,將其應用到對應的target,即可讓相關target支持Qt靜態庫的構建,非常的方便簡潔,關於構建規則的說明,可參考相關文檔:內建規則

如果大家想要支持其他構建環境,也只需要方便的自定義一個自己的擴展規則,應用到對應的target即可實現,言歸正傳,我們看下Qt靜態庫的xmake.lua描述:

target("test")
    add_rules("qt.static")
    add_files("src/*.cpp")
    add_frameworks("QtNetwork", "QtGui")

非常簡單,一般只需要這幾行就ok了,如果需要用到Qt的一些框架庫,可以通過add_frameworks來添加, 接着就是正常的編譯過程:

$ xmake
動態庫程序

動態庫程序跟上節介紹的靜態庫描述規則類似,唯一的區別就是吧構建規則改成add_rules("qt.shared")就行了。

target("test")
    add_rules("qt.shared")
    add_files("src/*.cpp")
    add_frameworks("QtNetwork", "QtGui")

add_rules("qt.shared")和之前的set_kind("shared")有什麼區別呢,區別就是:

  • set_kind("shared"): 是xmake最爲基礎的動態庫構建模式,非常原始,不附加任何框架層的依賴庫和配置
  • add_rules("qt.shared"):僅用於Qt動態庫的構建,屬於內置的擴展規則,會附加Qt SDK的構建環境
控制檯程序

控制檯也是類似,直接替換構建規則就可以了:qt.console

target("test")
    add_rules("qt.console")
    add_files("src/*.cpp")
Quick應用程序

從Qt目前最新的SDK,主要提供了兩種ui app的構建框架,Quick App 和 Widgets App,xmake也都進行了支持,並且統一規範成:qt.application Qt應用程序規則來簡化設置。

target("qt_quickapp")
    add_rules("qt.application")
    add_files("src/*.cpp") 
    add_files("src/qml.qrc")
    add_frameworks("QtQuick")

看上述描述,僅僅只需要把對應的qml.qrc作爲源文件添加進去,然後附加需要的QtQuick依賴庫就行了。

注:雖然xmake的add_links也是用來添加依賴庫進行鏈接的,但是這裏建議對於Qt SDK提供的庫還是用add_frameworks來添加,因爲所有Qt的構建規則都對add_frameworks進行了擴展,
對Qt自帶的框架庫進行了更好的支持,也能根據構建模式自動切換debug/release版本的Qt庫。

Widgets應用程序

Widgets App的描述規則還是用的qt.application,只需要把.ui文件添加進去就行了,唯一需要注意的是,帶Q_OBJECTmeta的頭文件,例如:mainwindow.h這種,
因爲有個moc預處理過程,所以也需要把它添加到源文件中,這樣Qt的構建規則就會檢測到,將其自動進行moc預處理。

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

關於Qt SDK環境支持的更多詳情可以參考:#160

原文出處:http://tboox.org/cn/2018/05/30/support-qt/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章