xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。
本文我们会详细介绍下如何通过xmake来构建cuda程序以及与c/c++程序混合编译。
首先,我们需要安装NVIDIA提供的Cuda Toolkit SDK工具,其相关说明以及安装文档,可参考官方文档:CUDA Toolkit Documentation。
下载安装好Cuda SDK后,在macosx上会默认安装到/Developer/NVIDIA/CUDA-x.x
目录下,Windows上可以通过CUDA_PATH
的环境变量找到对应的SDK目录,而
Linux下默认会安装到/usr/local/cuda
目录下。
通常,xmake都能自动检测到默认的cuda安装环境,并不需要做任何操作,只需要执行xmake
命令就可以自动完成编译,当然如果找不到SDK,我们也可以手动指定Cuda SDK环境目录:
$ xmake f --cuda=/usr/local/cuda-9.1/
或者通过xmake g/global
命令切到全局设置,避免每次切换编译模式都要重新配置一遍。
$ xmake g --cuda=/usr/local/cuda-9.1/
如果想要测试xmake对当前cuda环境的探测支持,可以直接运行:
$ xmake l detect.sdks.find_cuda
{
linkdirs = {
"/Developer/NVIDIA/CUDA-10.2/lib/stubs",
"/Developer/NVIDIA/CUDA-10.2/lib"
},
bindir = "/Developer/NVIDIA/CUDA-10.2/bin",
sdkdir = "/Developer/NVIDIA/CUDA-10.2",
includedirs = {
"/Developer/NVIDIA/CUDA-10.2/include"
}
}
大家也可以帮忙贡献相关检测代码find_cuda.lua来改进xmake的检测机制。
接下来,我们就可以创建一个空工程来快速体验下了,xmake自带了cuda的工程模板,只需要指定对应的语言即可创建cuda项目:
$ xmake create -l cuda test
create test ...
[+]: xmake.lua
[+]: src/main.cu
[+]: .gitignore
create ok!
xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。
xmake完全支持对Qt5项目的维护和构建,通过本文将会带你了解如何通过xmake来维护各种类型的Qt项目。
Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它有自己的IDE程序:qt creator,也有自己的构建程序:qmake,似乎新版本开始打算全面切到cmake来维护了。
尽管如此,xmake还是对Qt的开发做了支持,搭配上xmake-vscode/xmake-idea等插件,使用户可以在自己熟悉的编辑器和IDE上集成和开发Qt程序,并且在不同平台上提供一致的开发体验。
首先,我们得准备好Qt开发环境,如果还没安装Qt SDK,那么到qt的官网登录下载安装包:https://www.qt.io/,或者自己拉取qt源码,编译静态版本sdk和工具链。
通常情况,如果是采用官方提供的QT SDK安装包,并且安装目录采用的默认路径,那么即使不配置QT SDK路径,xmake也会尝试去检测它,一般都是能检测到的,如果检测不到,我们可以尝试手动配置下它:
$ xmake f --qt=/home/xxx/qtsdk
或者设置到全局路径,避免每次编译切换都要配置一遍:
$ xmake g --qt=/home/xxx/qtsdk
xmake内置了各种Qt项目的空工程模板,我们可以通过xmake create
命令来快速创建它们。
注:由于xmake的master最新版本,也就是还未发布的v2.2.9版本对Qt的模板和构建规则进行了升级,因此本文主要讲解的都是基于最新版本来讲解, 而之前的老模版和规则也是向下兼容的,如果想要继续了解,可以查看相关文档:Qt项目开发文档
我们先来创建一个带qml的quickapp空工程,只需要敲如下命令:
$ xmake create -t qt.quickapp test
create test ...
[+]: xmake.lua
[+]: src/main.qml
[+]: src/main.cpp
[+]: src/qml.qrc
[+]: .gitignore
create ok!
xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。
本文主要详细讲解如何通过xmake编译可在android下运行的库和可执行程序。
首先,我们需要先准备好编译android native库必须的ndk工具链,如果还没有可以从官网下载解压即可:Android NDK
如果是为了获取更好的向下兼容性,可以选择r16版本,因为这个是最后一个支持armeabi的版本,如果没什么特别需求,可以直接下载最新版。
我们只需要将解压后ndk目录路径传递给xmake完成配置,可以直接编译了,例如:
$ xmake f -p android --ndk=~/downloads/android-ndk-r19c
$ xmake
其中,-p android
用于切换到android平台,因为如果不指定平台,默认会编译当前主机平台的target程序。
通常,如果没特殊需求,上面的配置就可以完成android native程序的编译,目前xmake内置支持:binary, static, shared这三种基础target类型文件的生成,分别对应可执行程序,.a静态库,.so动态库。
xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。
本文主要详细讲解如何编写一些常用的基础xmake.lua描述配置,来实现一些简单的C/C++项目构建管理。 对于大部分小项目,这些配置已经完全足够使用,本系列后期进阶教程中,我会深入详细讲解如果使用一些高级特性来更加灵活定制化地配置项目。
一行描述即可编译src目录下所有c源文件,然后生成一个名为demo的可执行文件。
target("demo", {kind = "binary", files = "src/*.c"})
上面的写法是精简写法,通常我们更推荐使用下面展开式写法:
target("demo")
set_kind("binary")
add_files("src/*.c")
这两者完全等价,如果配置很简短,可以完全精简成一行,而拆分成多行更加方便灵活配置。
如果没有特殊目的,下文我们都会采用第二段的写法。
通常的C/C++项目生成的目标文件主要有三大类:可执行程序,静态库,动态库。
我们可以通过set_kind()
配置来设置,分别对应:binary, static, shared
例如,我们想要编译动态库,只需要修改kind:
target("demo")
set_kind("shared")
add_files("src/*.c")
编译宏的设置,大多数c/c++项目都会用到,一般如果我们设置编译flags传给gcc/clang,都是要配置:-DXXX
而在xmake里面,提供了add_defines()
内置接口来配置:
target("demo")
set_kind("shared")
add_files("src/*.c")
add_defines("XXX")
xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。
本文主要详细讲解如何加载运行编译好的目标程序,以及如何去调试。
xmake也提供了run命令,直接运行生成后的可执行文件,用于方便快速的进行测试,例如:
$ xmake run
hello xmake!
我们也可以在xmake.lua中通过add_runenvs
接口来添加设置默认运行target程序的环境变量。
所以,对于PATH这种,通过此接口追加值是非常方便的,而且此接口支持多值设置,所以通常就是用来设置带有path sep的多值env。。
target("test")
set_kind("binary")
add_files("src/*.c")
add_runenvs("PATH", "/tmp/bin", "xxx/bin")
add_runenvs("LD_LIBRARY_PATH", "/tmp/lib", "xxx/lib")
更多关于此接口的描述,可以看下文档:add_runenvs接口文档