OpenWrt 针对多种 CPU 构架都有对应的镜像文件,也可以理解为对应目标平台的专用发行版。但是这里好像有个问题,就是不是所有的 CPU 平台都可以运行编译工具来生成对应的软件包,可以针对该平台的软件包一个也不少,原因就是交叉编译。
交叉编译,简单来说就是在一个 CPU 架构的平台上生成另一个 CPU 架构平台上的可执行文件,举个例子,使用 PC 电脑(x86_64平台)编译出路由器(例如 MIPS32)上可以执行的二进制文件,就是交叉编译。所以说,如果想要进行交叉编译,需要有对应平台的编译器,这个编译器会提供该平台编译时的工具链,利用这个工具链,就可以交叉编译出所需要的二进制文件。
创建交叉编译器的过程可能会很棘手,虽然这并不是经常的事情。我们可以手动创建工具链,然后在编译配置时添加类似于”–host=mips32″这样的参数来指定目标平台,之后就可以进行正常编译生成二进制文件。
虽然可以手动创建工具链,然后使用它构建OpenWrt,但这很困难且容易出错。 OpenWrt 构建系统采用了一种不同的方法来构建固件:它从头开始下载、打补丁和编译所有内容,包括交叉编译器。 或者用更简单的话说,OpenWrt的构建系统不包含任何可执行文件甚至源代码。它是一个自动化系统,用于下载源代码,将其打补丁以适应给定的平台,并正确地为该平台编译它们。 这意味着只需更改模板,就可以更改流程中的任何步骤。当然,这样做的附带好处是构建是自动化的,节省时间,并且每次都能保证相同的结果。
所以,对于 OpenWrt 的交叉编译就变得相对简单,可以使用 OpenWrt 提供的工具链来构建专用的编译器,也可以使用 OpenWrt 提供的 SDK 工具包来进行交叉编译。相对来说,使用 SDK 工具包是最就方便的方式,因为这个 SDK 工具就是 OpenWrt 专门为对应平台构建的包含工具链的编译器。
本教程将实例演示如何使用 x86_64 的主机,交叉编译生成联发科 MT7891B 平台的 xray-core 软件包。
1] 下载 SDK 工具包
OpenWrt 针对 MT7981B CPU 有专门的镜像包和”Supplementary Files” ,镜像包会根据使用了该芯片的不同品牌的路由器产品加以区分,而”Supplementary Files”就包含了 MT7981B 的工具链和 SDK 工具包。对于 MT7981B,OpenWrt 的镜像位于”/targets/mediatek/filogic/”,不同版本的发行版前缀不同,最新的发行为24.10.4,所以其 SDK 的下载地址为”https://downloads.openwrt.org/releases/24.10.4/targets/mediatek/filogic/“。找到”Supplementary Files”,然后下载”openwrt-sdk-24.10.4-mediatek-filogic_gcc-13.3.0_musl.Linux-x86_64.tar.zst“,这就是交叉编译所需的工具包。

图.1 下载交叉编译 SDK 工具包
从 SDK 工具包的文件名也可以大概了解到,这个工具是适用于 x86_64 架构 Linux 系统的。
将工具包解压并进入到解压后的目录,就可以进行软件包的编译了。
2] 编译 xray-core
进入 SDK 目录后,就可以执行如下命令来更新和安装第三方软件包到模板了:
$ ./scripts/feeds update -a $ ./scripts/feeds install -a
注意执行此脚本最好不要使用 root 用户,容易引起错误。
由于脚本会从互联网下载必要文件,所以在执行脚本时最好给主机提供较好的网络环境,以免出错。
脚本全部执行完成后,就会在当前目录生一个”feeds”目录,下载的编译模板就会保存在这个目录里。由于 xray-core 已经包含在 SDK 的 feeds 模板里,也就不需要再添加其他源至 fees 文件了。在”feeds/packages/net/xray-core/”目录中,有一个”Makefile”文件,这是 xray-core 的编译文件。打开它,会出现如内容:
include $(TOPDIR)/rules.mk PKG_NAME:=xray-core PKG_VERSION:=25.1.30 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)? PKG_HASH:=983ee395f085ed1b7fbe0152cb56a5b605a6f70a5645d427c7186c476f14894e ......
可以看到,预安装的 xray-core 版本是 25.1.30,比较老,目前最新版是 25.12.8,我们可以手动修改这个编译文件,将”PKG_VERSION:=25.1.30″修改为”PKG_VERSION:=25.12.8″。
由于 xray-core 的编译相当于下载源文件压缩包在本机生成对应平台的可执行文件,而在下载时会进行文件 HASH 值验证,所以还要修改”PKG_HASH”成正确值。这个值可以从网上找到,如果实在没有,也可以将压缩包下载下来,自己计算得到:
$ wget https://codeload.github.com/XTLS/Xray-core/tar.gz/v25.12.8 $ openssl sha256 v25.12.8 SHA2-256(v25.12.8)= d4519b2d9bb1871f4d7612aa7a8db1c451573b5a44ac824219bb44d63f404e61
得到的这个”d4519b2d9bb1871f4d7612aa7a8db1c451573b5a44ac824219bb44d63f404e61″值就是对应的”PKG_HASH”值:

图.2 计算PKG_HASH 值
于是,这个”Makefile”就可以修改成如下内容:
include $(TOPDIR)/rules.mk PKG_NAME:=xray-core PKG_VERSION:=25.12.8 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)? PKG_HASH:=d4519b2d9bb1871f4d7612aa7a8db1c451573b5a44ac824219bb44d63f404e61 ......
其他内容保持不变即可。
之后,就可以使用如下命令来编译 MT7981B 平台的 xray-core 软件包了:
$ make menuconfig $ make package/xray-core/compile V=99
第一条命令执行后会出现窗口进行相关配置,由于不需要内容修改,直接退出保存即可。第二条命令执行后会生成对应的可执行文件。
如果在编译过程中出错,并且出现如下提示:
Building targets go: ../../go.mod requires go >= 1.25 (running go 1.23.12; GOTOOLCHAIN=local)
这是由于编译时调用的 go 环境是 1.23.12,而新版本的 xray-core 编译要求 go 版本不低于 1.25,所以还需要更换 go 环境。
在执行完”./scripts/feeds install -a”后,执行如下命令,就完成了 go 环境的替换:
$ rm -rf feeds/packages/lang/golang $ git clone https://github.com/sbwml/packages_lang_golang -b 25.x feeds/packages/lang/golang
再次执行编译命令,就可以在”/bin/packages/aarch64_cortex-a53/packages”目录找到成功生成的联发科平台 xray-core 可执行文件了。