xmake 新增对 Qt 编译环境支持,用自己最喜爱的编辑器去开发 Qt 程序 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
waruqi
V2EX    程序员

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

  •  1
     
  •   waruqi
    waruqi 2018 年 5 月 31 日 3114 次点击
    这是一个创建于 2863 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近给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 年 5 月 31 日 via Android
    能直接兼容 cmake 么,cmake 就是一个又大又没什么功能的软件
    waruqi
        2
    waruqi  
    OP
       2018 年 5 月 31 日 via Android
    @p64381 你是指哪方面兼容?
    p64381
        3
    p64381  
       2018 年 5 月 31 日 via Android
    @waruqi 对于已有 cmake 项目,在系统没有 cmake 的情况下,通过 xmake 编译
    waruqi
        4
    waruqi  
    OP
       2018 年 5 月 31 日
    @p64381 不支持
    caikelun
        5
    caikelun  
       2018 年 5 月 31 日
    厉害了!!
    p64381
        6
    p64381  
       2018 年 5 月 31 日 via Android
    @waruqi 先转换格式也不行么。
    waruqi
        7
    waruqi  
    OP
       2018 年 5 月 31 日
    @p64381 暂时不支持,目前主要精力还是在完善 xmake.lua 为主,从 CMakelist.txt 转成 xmake.lua ,暂时没时间精力去弄,但是 xmake 提供了灵活的插件扩展,欢迎大家贡献插件来支持。
    waruqi
        8
    waruqi  
    OP
       2018 年 5 月 31 日 via Android
    https://t.me/joinchat/F2dIAw5iTkAih7QzhmVp7A TBOOX 开源工程 telegram 群组 ,大伙有兴趣的也可以加一下
    friz
        9
    friz  
       2018 年 5 月 31 日
    刚好打算学习一下 qt,谢谢了
    waruqi
        10
    waruqi  
    OP
       2018 年 5 月 31 日
    @FerrisChan 不客气。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3164 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 12:38 PVG 20:38 LAX 05:38 JFK 08:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86