百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

xmake 使用方式(xmake vscode)

ccwgpt 2024-10-28 15:00 28 浏览 0 评论

1. 简介

参考链接1:xmake的使用_云守护的专栏-CSDN博客_xmake

XMake是一个基于Lua的轻量级跨平台自动构建工具,支持在各种主流平台上构建项目。

xmake的目标是开发者更加关注于项目本身开发,简化项目的描述和构建,并且提供平台无关性,使得一次编写,随处构建

它跟cmake、automake、premake有点类似,但是机制不同,它默认不会去生成IDE相关的工程文件,采用直接编译,并且更加的方便易用

采用lua的工程描述语法更简洁直观,支持在大部分常用平台上进行构建,以及交叉编译

并且xmake提供了创建、配置、编译、打包、安装、卸载、运行等一些actions,使得开发和构建更加的方便和流程化。

2. 支持特性

支持windows、mac、linux、ios、android等平台,自动检测不同平台上的编译工具链(也可手动配置);

编译windows项目采用原生vs的工具链,不需要使用cygwin、mingw(当然这些也支持)

支持自定义平台编译配置,可以很方便地扩展第三方平台支持

采用lua脚本语法描述项目,描述规则简单高效,逻辑规则可灵活修改,并且不会生成相关平台的工程文件,是工程更加简单明了

支持创建模板工程、配置项目、编译项目、运行、打包、安装和卸载等常用功能(后续还会增加:自动生成文档、调试等模块)

支持编译c/c++/objc/swift成静态库、动态库、命令行可执行程序

提供丰富的工程描述api,使用简单灵活,例如添加编译文件只需(还支持过滤排除):

add_files("src/*.c", "src/asm/**.S", "src/*.m")


支持头文件、接口、链接库依赖、类型的自动检测,并可自动生成配置头文件config.h

支持自定义编译配置开关,例如如果在工程描述文件中增加了enable_xxx的开关,那么配置编译的时候就可以手动进行配置来启用它:

xmake config --enable_xxx=y

提供一键打包功能,不管在哪个平台上进行打包,都只需要执行一条相同的命令,非常的方便

支持全局配置,一些常用的项目配置,例如工具链、规则描述等等,都可以进行全局配置,这样就不需要每次编译不同工程,都去配置一遍

除了可以自动检测依赖模块,也支持手动强制配置模块,还有各种编译flags。

支持插件扩展、平台扩展、模板扩展、选项自定义等高级功能

提供一些内置的常用插件(例如:自动生成doxygen文档插件,宏脚本记录和运行插件)

宏记录插件里面提供了一些内置的宏脚本(例如:批量打包一个平台的所有archs等),也可以在命令行中手动记录宏并回放执行

提供强大的task任务机制不依赖makefile和make,实现直接编译,内置自动多任务加速编译, xmake是一个真正的构架工具,而不仅仅是一个工程文件生成器

自动检测ccache,进行自动缓存提升构建速度

自动检测头文件依赖,并且快速自动构建修改的文件

3. 架构和流程

参考链接2:xmake: 轻量级跨平台C/C++构建工具,采用lua语法接口API描述项目,提供依赖检测、编译、打包、安装、运行、调试一条龙服务 (gitee.com)

4. 支持平台

Windows (x86, x64)

macOS (i386, x86_64, arm64)

Linux (i386, x86_64, cross-toolchains ..)

BSD (i386, x86_64)

Android (x86, x86_64, armeabi, armeabi-v7a, arm64-v8a)

iOS (armv7, armv7s, arm64, i386, x86_64)

WatchOS (armv7k, i386)

AppleTVOS (armv7, arm64, i386, x86_64)

MSYS (i386, x86_64)

MinGW (i386, x86_64, arm, arm64)

Cygwin (i386, x86_64)

Wasm (wasm32)

Cross (cross-toolchains ..)

5. 支持工具链


6. 支持语言

Objc/Objc++

Swift

Assembly

Golang

Rust

Dlang

Fortran

Cuda

Zig

7. 工程类型

静态库程序

动态库类型

控制台程序

Cuda程序

Qt应用程序

WDK驱动程序

WinSDK应用程序

MFC应用程序

iOS/MacOS应用程序

Framework和Bundle程序(iOS/MacOS)

8. xmake新增对Qt编译环境支持

8.1. 参考链接

参考链接3:xmake新增对Qt编译环境支持_TBOOX开源工程-CSDN博客

参考链接4:xmake 描述语法和作用域详解_TBOOX开源工程-CSDN博客

8.2. 简述

在最新的xmake v2.2.1版本中,新增了对Qt SDK环境的支持,我们完全可以脱离Qt Creater进行Qt应用程序的开发,甚至配合vscode/idea等编辑器+xmake插件(xmake-vscode, xmake-idea …),用户完全可以切换到自己最常用的编辑器环境中去开发和构建Qt程序。

8.3. 模板创建空工程

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内容大概长这样:

8.4. Qt SDK环境配置

默认情况下xmake会自动探测Qt环境,当然如果找不到Qt SDK环境,用户也可以手动指定Qt SDK环境目录:

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

8.5. 静态库程序

xmake通过内置的构建规则qt.static,将其应用到对应的target,即可让相关target支持Qt静态库的构建,非常的方便简洁。

xmake官方网站:xmake

支持其他构建环境,也只需要方便地自定义一个自己的扩展规则,应用到对应的target即可实现,言归正传,我们看下Qt静态库的xmake.lua描述:

taget("test")

add_rules("qt.static")

add_files("src/*.cpp")

add_frameworks("QtNetwork", "QtGui")

非常简单,一般只需要这几行就ok了,如果需要用到Qt的一些框架库,可以通过add_frameworks来添加, 接着就是正常的编译过程:

$ xmake

8.6. 动态库程序

动态库程序跟上节介绍的静态库描述规则类似,唯一的区别就是吧构建规则改成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的构建环境。

8.7. 控制台程序

控制台也是类似,直接替换构建规则就可以了:qt.console

target("test")

add_rules("qt.console")

add_files("src/*.cpp")

8.8. 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库。

8.9. 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")

参考链接5:xmake新增对Qt编译环境支持 (tboox.org)

相关推荐

定时任务工具,《此刻我要...》软件体验

之前果核给大家介绍过一款小众但实用的软件——小说规则下载器,可以把网页里的小说章节按照规则下载到本地,非常适合喜欢阅读小说的朋友。有意思的是,软件作者当时看到果核写的体验内容后,给反推荐到他的帖子里去...

前端定时任务的神库:Node-cron,让你的项目更高效!

在前端开发中,定时任务是一个常见的需求。无论是定时刷新数据、轮询接口,还是发送提醒,都需要一个可靠且灵活的定时任务解决方案。今天,我要向大家介绍一个强大的工具——Node-cron,它不仅能解决定时任...

Shutter Pro!一款多功能定时执行任务工具

这是一款可以在电脑上定时执行多种任务的小工具,使用它可以根据时间,电量等来设定一些定时任务,像定时打开程序、打开文件,定时关机重启,以及定时弹窗提醒等都可以轻松做到。这是个即开即用的小工具,无需安装,...

深度解析 Redis 缓存击穿及解决方案

在当今互联网大厂的后端开发体系中,Redis缓存占据着极为关键的地位。其凭借高性能、丰富的数据类型以及原子性操作等显著优势,助力众多高并发系统从容应对海量用户的访问冲击,已然成为后端开发从业者不可或...

从零搭建体育比分网站完整步骤(比较好的体育比分软件)

搭建一个体育比分网站是一个涉及前端、后端、数据源、部署和维护的完整项目。以下是从零开始搭建的详细流程:一、明确项目需求1.功能需求:实时比分展示(如足球、篮球、网球等)支持多个联赛和赛事历史数据查询比...

告别复杂命令行:GoCron 图形界面让定时任务触手可及

如果你是运维人员或者经常接触一些定时任务的配置,那么你一定希望有一款图形界面来帮助你方便的轻松配置定时任务,而GoCron就是这样一款软件,让你的配置可视化。什么是GoCron从名字你就可以大概猜到,...

Java任务管理框架核心技术解析与分布式高并发实战指南

在当今数字化时代,Java任务管理框架在众多应用场景中发挥着关键作用。随着业务规模的不断扩大,面对分布式高并发的复杂环境,掌握其核心技术并进行实战显得尤为重要。Java任务管理框架的核心技术涵盖多个方...

链表和结构体实现:MCU软件定时器(链表在单片机中的应用)

在一般的嵌入式产品设计中,介于成本、功耗等,所选型的MCU基本都是资源受限的,而里面的定时器的数量更是有限。在我们软件设计中往往有多种定时需求,例如脉冲输出、按键检测、LCD切屏延时等等,我们不可能...

SpringBoot定时任务(springboot定时任务每小时执行一次)

前言在我们开发中,经常碰到在某个时间点去执行某些操作,而我们不能人为的干预执行,这个时候就需要我们使用定时任务去完成该任务,下面我们来介绍下载springBoot中定时任务实现的方式。定时任务实现方式...

定时任务新玩法!systemd timer 完整实战详解

原文链接:「链接」Hello,大家好啊!今天给大家带来一篇使用systemdtimer实现定时任务调度的详细实战文章。相比传统的crontab,systemdtimer更加现代化、结构清晰...

Celery与Django:打造高效DevOps的定时任务与异步处理神器

本文详细介绍了Celery这一强大的异步任务队列系统,以及如何在Django框架中应用它来实现定时任务和异步处理,从而提高运维开发(DevOps)的效率和应用性能。下面我们先认识一下Cele...

订单超时自动取消的7种方案,我用这种!

前言在电商、外卖、票务等系统中,订单超时未支付自动取消是一个常见的需求。这个功能乍一看很简单,甚至很多初学者会觉得:"不就是加个定时器么?"但真到了实际工作中,细节的复杂程度往往会超...

裸机下多任务框架设计与实现(gd32裸机配置lwip 网络ping不通)

在嵌入式系统中,特别是在没有操作系统支持的裸机环境下,实现多任务执行是一个常见的挑战。本文将详细介绍一种基于定时器的多任务框架设计,通过全局时钟和状态机机制,实现任务的非阻塞调度,确保任务执行中不会出...

亿级高性能通知系统构建,小白也能拿来即用

作者介绍赵培龙,采货侠JAVA开发工程师分享概要一、服务划分二、系统设计1、首次消息发送2、重试消息发送三、稳定性的保障1、流量突增2、问题服务的资源隔离3、第三方服务的保护4、中间件的容错5、完善...

运维实战:深度拆解Systemd定时任务原理,90%的人不知道的玩法

运维实战:深度拆解Systemd定时任务原理,90%的人不知道的高效玩法一、Systemd定时任务的核心原理Systemd定时任务是Linux系统中替代传统cron的现代化解决方案,通过...

取消回复欢迎 发表评论: