V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
waruqi
V2EX  ›  程序员

xmake 新增对 Qt 编译环境支持,用自己最喜爱的编辑器去开发 Qt 程序

  •  1
     
  •   waruqi ·
    waruqi · 2018-05-31 09:30:21 +08:00 · 2512 次点击
    这是一个创建于 2380 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近给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")
    

    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

    项目源码:https://github.com/tboox/xmake,欢迎大伙 star

    10 条回复    2018-05-31 23:31:02 +08:00
    p64381
        1
    p64381  
       2018-05-31 10:03:08 +08:00 via Android
    能直接兼容 cmake 么,cmake 就是一个又大又没什么功能的软件
    waruqi
        2
    waruqi  
    OP
       2018-05-31 10:15:28 +08:00 via Android
    @p64381 你是指哪方面兼容?
    p64381
        3
    p64381  
       2018-05-31 10:24:45 +08:00 via Android
    @waruqi 对于已有 cmake 项目,在系统没有 cmake 的情况下,通过 xmake 编译
    waruqi
        4
    waruqi  
    OP
       2018-05-31 10:35:41 +08:00
    @p64381 不支持
    caikelun
        5
    caikelun  
       2018-05-31 14:19:17 +08:00
    厉害了!!
    p64381
        6
    p64381  
       2018-05-31 15:46:01 +08:00 via Android
    @waruqi 先转换格式也不行么。
    waruqi
        7
    waruqi  
    OP
       2018-05-31 16:28:52 +08:00
    @p64381 暂时不支持,目前主要精力还是在完善 xmake.lua 为主,从 CMakelist.txt 转成 xmake.lua ,暂时没时间精力去弄,但是 xmake 提供了灵活的插件扩展,欢迎大家贡献插件来支持。
    waruqi
        8
    waruqi  
    OP
       2018-05-31 20:19:03 +08:00 via Android
    https://t.me/joinchat/F2dIAw5iTkAih7QzhmVp7A TBOOX 开源工程 telegram 群组 ,大伙有兴趣的也可以加一下
    FerrisChan
        9
    FerrisChan  
       2018-05-31 23:19:03 +08:00
    刚好打算学习一下 qt,谢谢了
    waruqi
        10
    waruqi  
    OP
       2018-05-31 23:31:02 +08:00
    @FerrisChan 不客气。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3788 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:15 · PVG 12:15 · LAX 20:15 · JFK 23:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.