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

xmake从入门到精通2:创建和编译工程

bigegpt 2024-09-10 11:19 75 浏览

xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。

本文主要详细讲解如何创建一个基于xmake的工程以及编译操作。

  • 项目源码
  • 官方文档

创建空工程

xmake提供了xmake create命令,可以很方便的快速创建基于c/c++, swift, objc等各种语言的空工程项目,比如:

$ xmake create test
create test ...
 [+]: xmake.lua
 [+]: src/main.cpp
 [+]: .gitignore
create ok!

默认会创建一个c++的hello world工程,根目录下会生成一个xmake.lua用于描述项目的构建规则。

add_rules("mode.debug", "mode.release")
target("test")
 set_kind("binary")
 add_files("src/*.cpp") 

这是一个非常简单的xmake.lua描述,target("test")定义了一个子工程模块test,每个target会生成一个对应的目标文件,此处的binary类型,指定创建一个最基础的可执行文件。

而最上面的mode.debug和mode.release规则设置,是可选设置,但是通常我们都会建议加上,这样默认就可以生效两种常用的构建模式:debug和release

执行编译

通常我们如果只是编译当前主机环境的可执行文件,只需要执行xmake这个命令就可以了:

$ xmake
checking for the Xcode directory ... /Applications/Xcode.app
checking for the SDK version of Xcode ... 10.15
[ 0%]: ccache compiling.release src/main.cpp
[100%]: linking.release test

xmake默认会检测当前环境已存在的构建环境,比如笔者当前的xcode环境,然后默认采用release模式编译,如果设置了mode.release规则,那么就会生效。

编译模式切换

而如果我们要切到mode.debug编译,只需要:

$ xmake f -m debug
$ xmake

其中,xmake f是xmake config命令的简写,用来快速的切换配置,如果上手之后,通常采用简写会更加方便,更多命令的简写,都可执行xmake --help查看。

创建其他模板工程

xmake create还可以用来创建各种其他类型的工程项目,我们可以敲xmake create --help看下:

$ xmake create --help
Usage: $xmake create [options] [target]

Create a new project.

Options: 
 
 -l LANGUAGE, --language=LANGUAGE The project language (default: c++)
 - c++
 - go
 - dlang
 - cuda
 - rust
 - swift
 - objc
 - c
 - objc++
 -t TEMPLATE, --template=TEMPLATE Select the project template id or name of the given language. 
 (default: console)
 - console: c++, go, dlang, cuda, rust, swift, objc, c, objc++
 - qt.console: c++
 - qt.quickapp: c++
 - qt.quickapp_static: c++
 - qt.shared: c++
 - qt.static: c++
 - qt.widgetapp: c++
 - qt.widgetapp_static: c++
 - shared: c++, dlang, cuda, c
 - static: c++, go, dlang, cuda, rust, c
 - tbox.console: c++, c
 - tbox.shared: c++, c
 - tbox.static: c++, c
 
 target Create the given target.
 Uses the project name as target if not exists.

从上面的帮助菜单,我们可以大概了解到,可以通过-l/--language来指定工程语言,而-t/--template用来指定闯将的工程模板类型。

比如,我们创建一个基于c的静态库项目:

$ xmake create -l c -t static test
create test ...
 [+]: xmake.lua
 [+]: src/interface.c
 [+]: src/interface.h
 [+]: src/test.c
 [+]: src/main.cpp
 [+]: .gitignore
create ok!

我们也可以创建基于qt的quickapp项目:

$ xmake create -l c++ -t qt.quickapp test
create test ...
 [+]: xmake.lua
 [+]: src/interface.c
 [+]: src/main.qml
 [+]: src/interface.h
 [+]: src/test.c
 [+]: src/main.cpp
 [+]: src/qml.qrc
 [+]: .gitignore
create ok!

除了c/c++项目,xmake还支持其他语言的项目编译,但xmake重点还是在c/c++上,支持其他语言也主要是为了支持跟c/c++进行混合编译,毕竟其他语言向rust什么的官方有提供更好的构建方案。

不过我们还是可以使用xmake来尝试编译他们:

$ xmake create -l rust test
create test ...
 [+]: xmake.lua
 [+]: src/main.rs
 [+]: .gitignore
create ok!
$ xmake
checking for the architecture ... x86_64
checking for the Xcode directory ... /Applications/Xcode.app
checking for the SDK version of Xcode ... 10.15
[ 0%]: linking.release test

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...