常见的OpenWrt系统编译错误以及解决方案

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。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenWrt是一个基于Linux的嵌入式系统,它的编译框架是其核心功能之一。OpenWrt编译框架主要包括以下几个组件和步骤。 首先,OpenWrt编译框架使用Makefile来管理代码和编译过程。Makefile是一种脚本语言,用于指定编译规则和依赖关系。通过递归地调用Makefile,OpenWrt可以在不同的平台和硬件架构上进行编译。 其次,OpenWrt编译框架采用交叉编译的方式。这意味着在编译过程中,OpenWrt会使用一个与目标平台和硬件架构不同的编译器来生成可在目标平台上运行的二进制文件。这种方式的好处是可以提高编译效率和二进制文件的兼容性。 另外,OpenWrt编译框架支持模块化的开发和配置。用户可以通过配置文件来选择需要编译的软件包和功能模块,以满足个性化的需求。OpenWrt的软件包管理系统包括了大量的开源软件包,用户可以根据自己的需求选择合适的软件包进行编译和安装。 最后,OpenWrt编译框架还提供了多种编译选项和工具,用于优化和定制编译过程。用户可以通过编译选项来配置编译环境和目标系统的特性,以达到性能、稳定性或其他需求。同时,OpenWrt还提供了一些补丁和工具,用于修复和增强软件包的功能和安全性。 总的来说,OpenWrt编译框架是一个灵活、可扩展的系统,它允许用户根据自己的需求自定义和编译嵌入式系统。通过这个编译框架,用户可以轻松地添加、删除和配置软件包,以获得一个符合自己需求的嵌入式系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值