跳转到内容

创建一个空工程:

sh
$ xmake create -t qt.console test
$ xmake create -t qt.static test
$ xmake create -t qt.shared test
$ xmake create -t qt.quickapp test
$ xmake create -t qt.widgetapp test

更多工程模板见:xmake create --help

默认会自动探测Qt环境,当然也可以指定Qt SDK环境目录:

sh
$ xmake f --qt=~/Qt/Qt5.9.1

如果想要使用 windows 下 MingW 的 Qt 环境,可以切到mingw的平台配置,并且指定下mingw编译环境的sdk路径即可,例如:

sh
$ xmake f -p mingw --sdk=C:\Qt\Qt5.10.1\Tools\mingw530_32

上述指定的 MingW SDK 用的是Qt下Tools目录自带的环境,当然如果有其他第三方 MingW 编译环境,也可以手动指定, 具体可以参考:MingW 编译配置

更多详情可以参考:#160

另外,当前xmake也支持Qt/Wasm,详情见:Wasm 配置

sh
$ xmake f -p wasm

静态库程序

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

动态库程序

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

控制台程序

lua
target("qt_console")
    add_rules("qt.console")
    add_files("src/*.cpp")

Quick 应用程序

lua
target("qt_quickapp")
    add_rules("qt.quickapp")
    add_files("src/*.cpp")
    add_files("src/qml.qrc")

注意

如果使用的自己编译的static版本QT SDK,那么需要切换到add_rules("qt.quickapp_static")静态规则才行,因为链接的库是不同的,需要做静态链接。

接下来,我们尝试编译下,通常,如果是使用Qt的安装包默认安装,也没有修改安装路径,那么大部分情况下都是可以自动检测到QT SDK的根路径,例如:

sh
$ 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%]: cache compiling.release src/main.cpp
[ 49%]: compiling.qt.qrc src/qml.qrc
[100%]: linking.release test
build ok!

然后我们继续运行下它:

sh
$ xmake run

效果如下:

Quick Plugin 程序

完整例子见:quickplugin example

lua
add_rules("mode.debug", "mode.release")

target("demo")
    add_rules("qt.qmlplugin")
    add_headerfiles("src/*.h")
    add_files("src/*.cpp")

    set_values("qt.qmlplugin.import_name", "My.Plugin")

Widgets 应用程序

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

注意

如果使用的自己编译的static版本QT SDK,那么需要切换到add_rules("qt.widgetapp_static")静态规则才行,因为链接的库是不同的,需要做静态链接。

运行效果如下:

Android 应用程序

2.2.6 之后版本,可以直接切到android平台编译Quick/Widgets应用程序,生成apk包,并且可通过xmake install命令安装到设备。

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

然后安装到设备:

sh
$ xmake install
installing appdemo ...
installing build/android/release/appdemo.apk ..
Success
install ok!👌

目前支持的 Qt SDK

来自 Qt 官方提供的 SDK 安装包

在 macos/windows 上通常能自动探测到,但是也可以手动指定 Qt SDK 路径。

sh
$ xmake f --qt=[qt sdk path]

来自 Ubuntu Apt 安装包

使用 apt 安装完 Qt SDK,xmake 也能够自动检测到。

sh
$ sudo apt install -y qtcreator qtbase5-dev
$ xmake

来自 msys2/pacman 的 Qt Mingw 安装包

xmake 也支持从 pacman 安装的 Qt Mingw SDK

sh
$ pacman -S mingw-w64-x86_64-qt5 mingw-w64-x86_64-qt-creator
$ xmake

来自 aqtinstall 脚本的 Qt SDK 包

aqtinstall 安装的 Qt SDK 是完全基于官方 SDK 结构的,所以 xmake 也完全支持。

但是,通常需要自己指定 SDK 路径。

sh
$ xmake f --qt=[Qt SDK]

跨平台 Qt 交叉编译

对于跨平台 Qt 开发,xmake 支持为主机工具和目标平台使用单独的 SDK。这在为不同于开发机器的平台构建 Qt 应用程序时特别有用。

--qt_host 选项允许您指定与构建机器兼容的 Qt 工具的位置,而 --qt 指向目标平台的 SDK:

sh
$ xmake f --qt=[target Qt sdk] --qt_host=[host Qt sdk]

注意

  • 确保主机和目标 Qt 版本匹配,否则可能会导致构建问题。
  • 本机部署工具(如 windeployqtmacdeployqt)必须在各自的平台上运行,因此跨平台任务(如 xmake install)可能会失败。

来自 xmake-repo 仓库的 Qt 包

xmake 现在官方提供了 Qt5 SDK 的各种模块包,可以自动集成使用,无需任何手动安装。

只需要配置集成包就行了,xmake 会自动处理 Qt 的安装集成,并且自动编译项目。

lua
add_rules("mode.debug", "mode.release")

add_requires("qt5widgets")

target("test")
    add_rules("qt.widgetapp")
    add_packages("qt5widgets")

    add_headerfiles("src/*.h")
    add_files("src/*.cpp")
    add_files("src/mainwindow.ui")
    -- add files with Q_OBJECT meta (only for qt.moc)
    add_files("src/mainwindow.h")

除了 qt5widgets 包,仓库还提供了 qt5gui, qt5network 等包,可以使用。

配置完,只需要执行:

sh
$ xmake

注意

Qt6 的包还在开发中,暂时仅仅只支持 Qt5

来自 vcpkg/conan 的 Qt 包

暂时还没时间支持,请尽量使用上面的方式集成 Qt SDK。