OpenWrt是一个开源的嵌入式操作系统,随着支持刷机的路由器越来越多,我们经常会自己编译对应固件,用于加入自己想要的功能,在编译过程中或多或少会遇到一些编译错误,如果你是新手,遇到这些问题可能有些不知所措。
为了让更多人学会编译OpenWrt固件,这里将常见的编译错误进行一个总结,并给出解决方案。
OpenWrt系统的编译总的来说是非常容易的,只要基本的Linux命令操作即可,所以并不需要开发基础。

编译错误分类

首先将编译问题进行分类,主要有以下几类:

编译系统问题

建议用ubuntu Linux系统编译,通常我们通过虚拟机安装ubuntu系统,在虚拟机中进行编译,为了保证编译环境没有问题,建议和openwrt发布时间相近的ubuntu版本,防止一些工具版本问题, 但ubuntu版本也不要追求最新,比openwrt早2-3年最合适。

ubuntu镜像可以去阿里云镜像官网下载:

https://developer.aliyun.com/mirror/

工具问题

在编译openwrt前需要在Linux(以ubuntu为例,下同)中安装一些常用的软件包,比如gcc、make、curl等,这些工具在编译时充当不同的角色,比如下载源码、打包镜像等,如果工具不全会导致编译报错,可以参照以下命令全部安装,当然如果遇到某个工具缺失,也可以自己额外安装。

sudo apt update -y   
sudo apt install -y cmake curl wget vim git antlr3 asciidoc autoconf automake autopoint binutils bison  \
build-essential bzip2 ccache  cpio  device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
 gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pyelftools \
libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip \
xmlto xxd zlib1g-dev ack 

报错示例

如果没有安装编译器或者其他工具,在更新feeds时会出现类似以下错误,会提示安装g++、ncurses等,解决方案就是先安装对应的工具,比如安装ncurses

sudo apt install -y libncurses5-dev libncursesw5-dev

Checking 'ldconfig-stub'... ok.

Build dependency: Please install the GNU C++ Compiler (g++) 6 or later
Build dependency: Please reinstall the GNU C++ Compiler (6 or later) - it appears to be broken
Build dependency: Please install ncurses. (Missing libncurses.so or ncurses.h)

Prerequisite check failed. Use FORCE=1 to override.
make: *** [/home/test/openwrt/include/toplevel.mk:182: /home/test/openwrt/staging_dir/host/.prereq-build] Error 1
Collecting package info: feeds/packages/lang/python/python-parsley^Cmake: *** wait: No child processes.  Stop.
make: *** Waiting for unfinished jobs....
make: *** wait: No child processes.  Stop.

网络问题

网络问题应该算是编译openwrt最主要问题,在国内环境中会经常遇到访问速度慢或者访问不了的问题,因为屏蔽了很多国外网站导致。

  1. OpenWrt源码下载

我们首先需要通过git命令clone openwrt源码,新手可能直接就被劝退,因为经常会出现以下错误

下载错误日志:

error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

下载成功应该是这样的:

test@test:~$ git clone https://github.com/openwrt/openwrt.git
Cloning into 'openwrt'...
remote: Enumerating objects: 653141, done.
remote: Counting objects: 100% (258/258), done.
remote: Compressing objects: 100% (215/215), done.
remote: Total 653141 (delta 100), reused 143 (delta 41), pack-reused 652883
Receiving objects: 100% (653141/653141), 243.35 MiB | 5.61 MiB/s, done.
Resolving deltas: 100% (437100/437100), done.

  1. dl package下载

错误日志

SHELL= flock /home/test/openwrt/tmp/.xz-5.4.3.tar.bz2.flock -c '  	/home/test/openwrt/scripts/download.pl "/home/test/openwrt/dl" "xz-5.4.3.tar.bz2" "9243a04598d7a70c1f567a0143a255581ac5c64b140fd55fd5cbc1e00b0e6f90" "" "@SF/lzmautils" "http://tukaani.org/xz"    '
Copyright(C) Derry(ttcoder.cn)
+ curl -f --connect-timeout 20 --retry 5 --location https://downloads.sourceforge.net/lzmautils/xz-5.4.3.tar.bz2
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:20 --:--:--     0
curl: (28) Connection timed out after 20004 milliseconds
Warning: Transient problem: timeout Will retry in 1 seconds. 5 retries left.
  0     0    0     0    0     0      0      0 --:--:--  0:00:20 --:--:--     0
curl: (28) Connection timed out after 20002 milliseconds
Warning: Transient problem: timeout Will retry in 2 seconds. 4 retries left.
  0     0    0     0    0     0      0      0 --:--:--  0:00:20 --:--:--     0
curl: (28) Connection timed out after 20004 milliseconds
Warning: Transient problem: timeout Will retry in 4 seconds. 3 retries left.

如果卡住出现timeout Will retry in 1 seconds. 5 retries left类似的打印,表示网络不好,可以先统一下载dl包,需要检查网络是否正常,注意这里说的网络正常不是单指能够访问百度、新浪等国内网站,而是要访问对于的资源网站,因为出现失败极有可能是国内访问这些网站比较慢或者被禁引起,比如以上资源URL是https://downloads.sourceforge.net/lzmautils/xz-5.4.3.tar.bz2,则可以手动通过wget命令试试能不能访问

wget https://downloads.sourceforge.net/lzmautils/xz-5.4.3.tar.bz2

如果不行,则需要切换编译主机的网络或者搭建梯子再试,如果没有梯子,你也可以通过其他主机下载该资源后放在dl目录或者用数据热点网络试试,因为不同运营商对某些资源访问限制不同。 这种解决方案适用所有编译时的网络问题。

权限问题

root用户问题 openwrt是不建议用root用户编译的,如果通过root用户编译,会出现configure: error: you should not run configure as root报错。 详细错误日志如下:

checking for mkfifo... yes
checking whether mkfifo rejects trailing slashes... yes
checking whether mkfifoat rejects trailing slashes... yes
checking whether mknod can create fifo without root privileges... configure: error: in `/home/test/openwrt/build_dir/host/tar-1.34':
Copyright(C) Derry(ttcoder.cn)
configure: error: you should not run configure as root (set FORCE_UNSAFE_CONFIGURE=1 in environment to bypass this check)
See `config.log' for more details
make[3]: *** [Makefile:36: /home/test/openwrt/build_dir/host/tar-1.34/.configured] Error 1
make[3]: Leaving directory '/home/test/openwrt/tools/tar'
time: tools/tar/compile#8.80#3.90#24.21
    ERROR: tools/tar failed to build.
make[2]: *** [tools/Makefile:226: tools/tar/compile] Error 1
make[2]: Leaving directory '/home/test/openwrt'
make[1]: *** [tools/Makefile:222: /home/test/openwrt/staging_dir/host/stamp/.tools_compile_nyyynyynnnyyynynyyyyyyynyyynyynyynnynnyyyyyyyyyyyyyyyyynynnyyyyyyy] Error 2
make[1]: Leaving directory '/home/test/openwrt'
make: *** [/home/test/openwrt/include/toplevel.mk:232: world] Error 2

解决方案有两种:

  • 设置环境变量 设置环境变量FORCE_UNSAFE_CONFIGURE为1后会忽略root检查 export FORCE_UNSAFE_CONFIGURE=1
  • 切换到普通用户编译 注意,如果你直接切换到普通用户,会出现权限问题,因为某些文件已经通过root用户生成了,所以切换之前需要修改整个项目的权限,在openwrt源码更目录执行chmod 777 ./ -R命令修改权限。

多核编译问题

openwrt编译时我们会采用make V=s -j$corenum进行多核编译,其中$corenum为编译的cpu核心数,多核编译可以提高编译速度。
但是如果是首次用多核编译openwrt源码,一定会出现编译错误,并且错误日志还无法直观的看出原因,当遇到奇怪的编译问题时,
直接用make V=s单核编译,这样可以看到明确的错误日志,并且首次一定不能用多核编译,只有编译完成整个系统后,再次编译可以采用多核。

存储空间问题

在编译时可能会遇到no space之类的错误日志,这是因为编译机器没有磁盘空间了,需要给磁盘扩容,一般要给openwrt编译预留30G以上的空间。

总结

以上问题中,最难解决的就是网络问题,如果没有网络问题,只要会安装Linux就可以完成编译,这里再次给大家一些编译建议。

  • 没有外网环境时通过手机热点联网,一般数据网络是可以顺畅访问github等一些资源网站的
  • 可以租用云服务器进行编译,云服务器中编译时不存在网络问题的,可以按时长租用服务器即可,编译完成后把一些第三方包下载到本地环境
  • 如果只是openwrt框架源码下载失败,可以在gitee中搜索相关clone的仓库
  • 如果只是自己加入一些插件,可以考虑用现成的openwrt sdk打包固件,打包速度快并且对网络依赖小,也可以考虑云编译openwrt,网络上也有相关教程。

OpenWrt是一个非常好的嵌入式Linux项目,通过OpenWrt你可以方便地去学习Linux,比如Linux系统架构、Linux内核、Linux消息机制、Linux镜像打包、Linux驱动等,它适用于不同技术层面的用户。只需要一台家用路由器,就可以开始学习嵌入式Linux。

当然编译是第一步,希望通过以上编译错误总结,让大家不再被编译错误所困扰。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。