最近给xmake新增了对 Qt SDK 环境的支持,现在我们完全可以脱离 Qt Creator 进行 Qt 应用程序的开发,甚至配合 vscode/idea/sublime/vim 等编辑器+xmake 插件(xmake-vscode, xmake-idea, xmake-sublime ...), 用户完全可以切换到自己最常用的编辑器环境中去开发和构建 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")
默认情况下 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")
从 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 App 的描述规则还是用的qt.application
,只需要把.ui 文件添加进去就行了,唯一需要注意的是,带Q_OBJECT
meta 的头文件,例如: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
项目源码:https://github.com/tboox/xmake,欢迎大伙 star
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.