xmake是一个基于Lua的轻量级现代化c/c 的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。
除了win, linux, macOS平台,以及android, ios等移动端平台的内建构建支持,xmake也支持对各种其他工具链的交叉编译支持,本文我们将会详细介绍下如何使用xmake进行交叉编译。
交叉编译工具链简介
通常,如果我们需要在当前pc环境编译生成其他设备上才能运行的目标文件时候,就需要通过对应的交叉编译工具链来编译生成它们,比如在win/macos上编译linux的程序,或者在linux上编译其他嵌入式设备的目标文件等。
通常的交叉编译工具链都是基于gcc/clang的,大都具有类似如下的结构:
/home/toolchains_sdkdir
- bin
- arm-linux-armeabi-gcc
- arm-linux-armeabi-ld
- ...
- lib
- libxxx.a
- include
- xxx.h
每个工具链都有对应的include/lib目录,用于放置一些系统库和头文件,例如libc, stdc 等,而bin目录下放置的就是编译工具链一系列工具。例如:
arm-linux-armeabi-ar
arm-linux-armeabi-as
arm-linux-armeabi-c
arm-linux-armeabi-cpp
arm-linux-armeabi-g
arm-linux-armeabi-gcc
arm-linux-armeabi-ld
arm-linux-armeabi-nm
arm-linux-armeabi-strip
其中arm-linux-armeabi-
前缀就是cross,通过用来标示目标平台和架构,主要用于跟主机自身的gcc/clang进行区分。
里面的gcc/g 就是c/c 的编译器,通常也可以作为链接器使用,链接的时候内部会去调用ld来链接,并且自动追加一些c 库。cpp是预处理器,as是汇编器,ar用于生成静态库,strip用于裁剪掉一些符号信息,使得目标程序会更加的小。nm用于查看导出符号列表。
自动探测和编译
如果我们的交叉编译工具链是上文的结构,xmake会自动检测识别这个sdk的结构,提取里面的cross,以及include/lib路径位置,用户通常不需要做额外的参数设置,只需要配置好sdk根目录就可以编译了,例如:
$ xmake f -p cross --sdk=/home/toolchains_sdkdir
$ xmake
其中,-p cross
用于指定当前的平台是交叉编译平台,--sdk=
用于指定交叉工具链的根目录。
注:我们也可以指定-p linux
平台来配置交叉编译,效果是一样的,唯一的区别是额外标识了linux平台名,方便xmake.lua里面通过is_plat("linux")
来判断平台。
这个时候,xmake会去自动探测gcc等编译器的前缀名cross:arm-linux-armeabi-
,并且编译的时候,也会自动加上链接库
和头文件