OpenWrt SDK 编译软件包(基础篇)

2017-07-28 17463点热度 13条评论

OpenWrt 是个非常好用且强大的 Linux 发行版,常用于路由器等嵌入式设备。之前我也写了不少关于 OpenWrt 的教程。

OpenWrt 和其他 Linux 发行版一样,都可以通过软件包源码编译适合自己设备运行的软件包,不过由于 OpenWrt 大部分运行于路由器,存储空间不充裕,并没有像其他 Linux 发行版那样附带 GCC 可以及时编译,不过 OpenWrt 提供了 SDK,可以使用其他 Linux 发行版来为 OpenWrt 编译软件包。

这篇教程就教大家如何使用 OpenWrt SDK 来为自己路由器的 OpenWrt 编译软件包,这样大家就可以自己编译一些开源项目或者是《OpenWrt 安装及配置 Aria2 教程》里面提到的完整版 Aria2 这种的。

OpenWrt SDK 编译软件包

准备工作

首先需要一个 Linux 系统,可以使用 WSL2,但不要使用 WSL1。

本教程以 Ubuntu 为例

系统安装后,打开终端 Ctrl + Alt + T ,依次输入:sudo apt-get update # 更新软件源sudo apt-get upgrade -y # 更新软件包

然后使用下面的命令安装所需依赖:

sudo apt install build-essential ccache ecj fastjar file g++ gawk \
gettext git java-propose-classpath libelf-dev libncurses5-dev \
libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget \
python3-distutils python3-setuptools rsync subversion swig time \
xsltproc zlib1g-dev

然后前往 https://downloads.openwrt.org 下载适合你路由器的 OpenWrt SDK,根据 CPU 架构和系统版本,比如 K3,CPU 架构是 bcm53xx,系统是 OpenWrt Snapshots,下载 bcm53xx 的 OpenWrt Snapshots SDK。

下载 SDK

将下载好的 SDK 解压,就可以开始编译软件包了。

编译软件包

打开 SDK 文件夹 → 右键空白处 → [在终端打开] → 依次输入 ./scripts/feeds update -a # 更新软件列表./scripts/feeds install -a # 安装软件列表make defconfig # 生成配置文件

输入 make menuconfig 进入配置界面

界面操作

↑ ↓:目录选择

← →:功能选择

回车键:执行功能

Y: 选中

N:取消选中

Esc:返回

斜杠键:搜索

功能选项

Select (选择):这个选项下按回车才可以进入目录。

Exit (退出):和 ESC 键作用相同,返回上一级或退出。

Help (帮助):显示帮助信息。

Save (保存):保存当前配置信息变更,每次退出前记得保存一下。

Load (加载):加载其他配置文件,一般用不到。

目录后面有箭头都可以进入,前面有方括号的都可以选中。

接下来编译个自带软件列表的软件包,以完整版 Aria2 为例。

打开配置界面

依次进入 [Network] → [File Transfer]

Y 选中 Aira2

进入 [Aria2 Configuration]

有几个没有被启用的选项(功能),依次按 Y 选中启用

保存 → 退出

Aria2 配置

 

输入 make package/aria2/compile V=s 开始编译,耐心等待编译完成。如需编译其他软件包,把 aria2 改为对应的软件包名即可,前提是软件列表有对应软件包。

注:V=s的作用是输出详细信息

推荐使用代理加速软件包源码下载

如果你的 CPU 有多个线程,可以加上 -j线程数 来使用多线程编译,例如:make package/aria2/compile V=s -j4 # 启用4个线程

编译好的 ipk 文件可以在 bin/packages/arm_cortex-a9/packages 找到。当然,不同的软件包和 CPU 架构路径不一样,不过都在 bin/packages

有时候我们需要编译第三方软件包怎么办?接下来以 vlmcsd (KMS服务器) 为例,教大家编译第三方软件包。

输入 cd package # 进入 package 目录

git clone https://github.com/openwrt-develop/openwrt-vlmcsd.git # 获取 vlmcsd 源码git clone https://github.com/openwrt-develop/luci-app-vlmcsd.git # 获取 vlmcsd Luci 界面源码

cd .. # 返回上级(SDK)目录

make menuconfig

不知道软件包在那个分类怎么办?可以使用搜索功能,按斜杠键后输入关键字,然后找到我们需要的软件包,Location 就是软件包所在位置。

vlmcsd 在 Network → 找到软件包并选中

保存 → 退出

搜索软件包所在位置

 

输入 make package/openwrt-vlmcsd/compile V=s # 编译 vlmcsdmake package/luci-app-vlmcsd/compile V=s # 编译 Luci 界面。有小伙伴可能要问了,软件包名不是 vlmcsd 吗,为什么命令是 openwrt-vlmcsd ?

那个是源码文件夹名称,源码文件夹名称是 openwrt-vlmcsd,也可以把文件夹名称改下。

第三方软件包编译的 ipk 一般是在 bin/packages/arm_cortex-a9/base

适用于 OpenWrt SDK 编译第三方软件包可以在 GitHub 找到,你可以在搜索软件名称后面加上 openwrt,比如:"vlmcsd openwrt"。

常见问题

问:为什么我make menuconfig之后没有软件包?

答:需要更新 feed 列表源,./scripts/feeds update -a # 更新软件源./scripts/feeds install -a # 安装软件源

问:为什么我编译会报错?

答:详细查看输出信息,找出错误信息部分,并尝试解决,你也可以将错误信息截图至 QQ 群并@小山

问:软件源没我需要的软件包怎么办?

答:可以参考上面编译 KMS 服务器的方法,去 GitHub 寻找对应的软件包,也可以点击网站底部的 GitHub 图标到小山的仓库里寻找。注意!我重点说一下,并不是随便一个程序的源码复制/克隆到 SDK 目录就可以进行编译的。首先,确保你准备编译的源码支持configuremake,然后,这份源码不是直接放在 SDK 目录的,而是要再写一个 Makefile 用于 SDK,告诉 SDK,你这个源码的下载地址、软件包名称、版本号、依赖项等等,然后软件包才可以显示在软件包列表里,才可以用上面的方法编译。关于怎么写这个 Makefile,可以参考http://wiki.openwrt.org/doc/devel/packages,相信稍微有点编程基础的人都看得懂。当然,也有不用写 Makefile 的方法,直接用工具链编译,不过这个也有点麻烦,暂且不讨论。

如果你还有什么不懂的地方,欢迎在下方留言。


OK,以上就是使用 OpenWrt SDK 编译软件包教程基础篇,如果有哪里不懂或者哪里不对,可以留言给我或者加QQ 群

我会在进阶篇教大家如何编译其他的 Linux 开源软件,比如一些 Linux 软件虽然开源,不过并没有适用于 OpenWrt 编译的 Makefile,进阶篇会教大家制作 Makefile。写的时候发现涉及的难点太多,如果你想了解的话,可以去 QQ 群里找我。

微信公众号二维码

微信扫描二维码关注我们

如果觉得文章有帮助到你,可以点击下方的打赏按钮赞助下服务器费用。

小山

一个什么都不会但要装作很厉害的人

文章评论

  • janusdai

    请问 OpenWrt SDK在哪个链接下载的到,我在openwrt官网上没有找到 :redface:

    2018-05-16
  • 123

    楼主能编译一个mtk版k2p 潘多拉固件的完整版aria2吗

    2017-11-18
    • 小山

      @123 如何编译文章里已经说的很清楚了

      2017-11-18
      • 123

        @小山 编译不过去,老是有错误 :cry:

        2017-11-18
        • 小山

          @123 加QQ群,把错误信息截图。

          2017-11-18
      • 123

        @小山 截图已发qq群

        2017-11-18
  • 月下飞虹

    make menuconfig 里面只有Global building settings 和image configuration

    2017-08-26
    • 小山

      @月下飞虹 输入 ./scripts/feeds update -a # 更新软件源./scripts/feeds install -a # 安装软件源

      2017-08-26
      • 月下飞虹

        @小山 我是按照教程做的,用的ubuntu 17.04会有这个问题,换成deepin就可以了,不知道咋回事

        2017-08-26
        • 小山

          @月下飞虹 Ubuntu 应该没什么问题的,我就在上面编译固件的

          2017-08-26
  • 逸0oo

    楼主斐讯K3,CPU 架构是 BCM4709C啊

    2017-08-16
    • 小山

      @逸0oo 这个是型号,不是架构,完全两个不同的东西。

      2017-08-17
  • 此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据