oh-367x300

OpenWRT固件编译

从某种意义上讲,我们可以认为WRTnode就是为OpenWRT而生的,这块小小的无线路由开发板从筹划那天开始,就将能够运行OpenWRT固件作为其一个重要的里程碑。为此,WRTnode团队与OpenWRT团队进行了紧密的合作,才终于有了对WRTnode来讲具有划时代意义的39786这一版本,它标志着OpenWRT代码库开始直接支持WRTnode。下面介绍如何为WRTnode编译OpenWRT的固件。

下载源码

首先创建一个名为openwrt的工作目录:

$ mkdir openwrt
$ cd openwrt

$ svn co svn://svn.openwrt.org/openwrt/trunk

$ cd trunk

加入WRTnode相关feed

取出源码之后执行下面的命令,对OpenWRT的feeds进行更新和安装:

$ cp feeds.conf.default feeds.conf
$ echo 'src-git wrtnode https://github.com/WRTnode/openwrt-packages.git' >> ./feeds.conf
$ ./scripts/feeds update -a
$ ./scripts/feeds install -a

在OpenWrt提供的标准feeds之外,我们加入了了WRTnode所需要的一些额外的软件包,这些都放在WRTnode项目的github服务器上。

配置源码

OpenWRT源码的编译过程是由源码根目录下的.config文件进行控制的,你可以使用make menuconfig命令来对最终编译出来的固件进行配置。不过刚入手的时候建议先使用WRTnode提供的标准.config文件作为开始:

$ wget --no-check-certificate https://raw.githubusercontent.com/WRTnode/openwrt-patches/master/R39786/wrtnode_standard.config
$ cp wrtnode_standard.config .config
$ make oldconfig

在执行make oldconfig命令时如果出现提示信息,一路回车用默认选项就可以。

编译固件

此时在OpenWRT源码的根目录下执行下面的命令就可以开始固件的编译了,整个编译过程所持续的时间较长,请一定耐心等待。

$ make V=s

如果一切正常,你最终可以在bin/ramips目录下找到WRTnode所需要的固件文件openwrt-ramips-mt7620n-wrtnode-squashfs-sysupgrade.bin。

32 thoughts on “OpenWRT固件编译

  1. 这些编译是在Linux下进行的吧?有没有能在Windows下进行的教程?

    另外编译的过程需要联网吧?能不能先下载下来直接进行以避免编译过程中联网出现问题。

    谢谢了先。

    • 可以自行下载所需要的文件(保证版本和文件名)放到buildroot的dl文件夹下。

      我个人一般采用科学上网的方式手工去找美国的源

    • 使用VirtualBox建个虚拟机,在上面编译。兼容性好,非常灵活,占用资源也少,不用了删掉。不同版本有要求的话,可以建立多个虚拟机,想要那个起那个。

    • 严格说应该有4种
      第一是跟uboot,uboot参数,eeprom区,及OpenWrt固件混装成一个二进制流用编程器烧进去
      第二是在uboot里用tftp下载OpenWrt固件由uboot刷写
      第三是在OpenWrt里直接使用mtd write刷写
      第四是用luci在页面上更新系统

      在OpenWrt一般用户那里基本都使用第三种和第四种方法。跟刷手机似的。

  2. 编译不过,缺少fetchmail-6.3.26.tar.xz文件,因为:The BerliOS developer’s website has shut down in the week following 2014 May 12th.大家到http://www.fetchmail.info/下载后放入dl目录即可。那个同学维护的后续版本的openwrt编译文件应该更新一下了。

  3. 最好的方式是分为几个层,每个层由不同的牛人去维护,大家可以专注一些或做的更好。小白可以从最简单的层开始,一步步深入。我设想的有几层:1、基础的Uboot层,实现LinuxCore的载入;2、LinuxCore,实现操作系统级的支援;3、OpenWRT的服务层,如LUA/LUCI/OPKG,实现网络配置与服务、软件包管理;4、应用层,只需编译、安装应用软件,不用管其他的,可以是C/C++/LUA/Python的代码,大部分都是在这一层上工作,相当于Android上的虚拟机之上的东西。不同层之间要建立规范化的接口,越往底层越要保持稳定性,越向上层升级更新越快。只有大版本才进行跨层的升级。

  4. i got some problems when i build the openwrt image.
    wget: unable to resolve host address ‘lanuchpad.net’
    something like that.
    any idea to fix this?

  5. 我按照教程编译,却总是说找不到libcurl库,我自己把这个选项加上了都还这么提示,错误信息在下面,想请教一下这个问题该怎么解决:
    checking for LIBCURL… configure: error: Package requirements (libcurl >= 7.15.4) were not met:

    No package ‘libcurl’ found

    Consider adjusting the PKG_CONFIG_PATH environment variable if you
    installed software in a non-standard prefix.

    Alternatively, you may set the environment variables LIBCURL_CFLAGS
    and LIBCURL_LIBS to avoid the need to call pkg-config.
    See the pkg-config man page for more details.

    make[3]: *** [/home/erareco/openwrt/WRTnode/trunk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/transmission-2.83/.configured_] Error 1
    make[3]: Leaving directory `/home/erareco/openwrt/WRTnode/trunk/feeds/packages/net/transmission’
    make[2]: *** [package/feeds/packages/transmission/compile] Error 2
    make[2]: Leaving directory `/home/erareco/openwrt/WRTnode/trunk’
    make[1]: *** [/home/erareco/openwrt/WRTnode/trunk/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/stamp/.package_compile] Error 2
    make[1]: Leaving directory `/home/erareco/openwrt/WRTnode/trunk’
    make: *** [world] Error 2

      • 这段时间我按照上面的教程试了好多次,有时是像libcurl 这样有些包编译不过,有时是一些包下载不了。你真的一遍就能够通过吗?

  6. 在make V=s 的时候,会因为下载一个文件失败导致编译中止,
    –2014-06-24 17:32:30– http://mirror2.openwrt.org/sources/transmission-2.83.tar.xz
    Resolving mirror2.openwrt.org (mirror2.openwrt.org)… 46.4.11.11
    Connecting to mirror2.openwrt.org (mirror2.openwrt.org)|46.4.11.11|:80… connected.
    HTTP request sent, awaiting response… 404 Not Found
    2014-06-24 17:32:30 ERROR 404: Not Found.

    Download failed.
    –2014-06-24 17:32:31– http://downloads.openwrt.org/sources/transmission-2.83.tar.xz
    Resolving downloads.openwrt.org (downloads.openwrt.org)… 78.24.191.177
    Connecting to downloads.openwrt.org (downloads.openwrt.org)|78.24.191.177|:80… connected.
    HTTP request sent, awaiting response… 404 Not Found
    2014-06-24 17:32:31 ERROR 404: Not Found.

    麻烦确认下,本人已经在墙外

  7. svn我没有用过,请问下怎么下载39786分支的代码,然后执行./scripts/feeds update -a 出现以下结果是什么原因。ERROR: please fix feeds/oldpackages/lang/perl-www-curl/Makefile – see logs/feeds/oldpackages/lang/perl-www-curl/dump.txt for details
    ERROR: please fix feeds/oldpackages/lang/perl-html-tree/Makefile – see logs/feeds/oldpackages/lang/perl-html-tree/dump.txt for details
    ERROR: please fix feeds/oldpackages/lang/perl-uri/Makefile – see logs/feeds/oldpackages/lang/perl-uri/dump.txt for details
    ERROR: please fix feeds/oldpackages/lang/perl-www/Makefile – see logs/feeds/oldpackages/lang/perl-www/dump.txt for details
    ERROR: please fix feeds/oldpackages/lang/perl-test-harness/Makefile – see logs/feeds/oldpackages/lang/perl-test-harness/dump.txt for details
    ERROR: please fix feeds/oldpackages/lang/perl-html-tagset/Makefile – see logs/feeds/oldpackages/lang/perl-html-tagset/dump.txt for details
    ERROR: please fix feeds/oldpackages/lang/perl-lockfile-simple/Makefile – see logs/feeds/oldpackages/lang/perl-lockfile-simple/dump.txt for details
    ERROR: please fix feeds/oldpackages/lang/perl-dbi/Makefile – see logs/feeds/oldpackages/lang/perl-dbi/dump.txt for details
    ERROR: please fix feeds/oldpackages/lang/perl-html-parser/Makefile – see logs/feeds/oldpackages/lang/perl-html-parser/dump.txt for details
    ERROR: please fix feeds/oldpackages/lang/perl-www-mechanize/Makefile – see logs/feeds/oldpackages/lang/perl-www-mechanize/dump.txt for details
    ERROR: please fix feeds/oldpackages/lang/perl-net-telnet/Makefile – see logs/feeds/oldpackages/lang/perl-net-telnet/dump.txt for details
    Collecting package info: done。麻烦解决下。谢谢

  8. 据说最新版的openwrt版本barrier_breaker已经支持wrtnode,能否出一个针对这个版本的编译环境搭建介绍?摸了半天,没摸出来。:-)

  9. 根据本文尝试编译时报错
    出错文件夹
    trunk/build_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/gcc-linaro-4.8-2014.04-final/gcc
    执行命令i686-redhat-linux-gcc -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -o cc1plus cp/cp-lang.o c-family/stub-objc.o cp/call.o cp/decl.o cp/expr.o cp/pt.o cp/typeck2.o cp/class.o cp/decl2.o cp/error.o cp/lex.o cp/parser.o cp/ptree.o cp/rtti.o cp/typeck.o cp/cvt.o cp/except.o cp/friend.o cp/init.o cp/method.o cp/search.o cp/semantics.o cp/tree.o cp/repo.o cp/dump.o cp/optimize.o cp/mangle.o cp/cp-objcp-common.o cp/name-lookup.o cp/cxx-pretty-print.o cp/cp-gimplify.o attribs.o incpath.o c-family/c-common.o c-family/c-cppbuiltin.o c-family/c-dump.o c-family/c-format.o c-family/c-gimplify.o c-family/c-lex.o c-family/c-omp.o c-family/c-opts.o c-family/c-pch.o c-family/c-ppoutput.o c-family/c-pragma.o c-family/c-pretty-print.o c-family/c-semantics.o c-family/c-ada-spec.o tree-mudflap.o glibc-c.o cc1plus-checksum.o libbackend.a main.o libcommon-target.a libcommon.a ../libcpp/libcpp.a ../libdecnumber/libdecnumber.a libcommon.a ../libcpp/libcpp.a -liconv ../libbacktrace/.libs/libbacktrace.a ../libiberty/libiberty.a ../libdecnumber/libdecnumber.a -lstdc++ -L/root/openwrt/trunk/staging_dir/host/lib -L/root/openwrt/trunk/staging_dir/host/lib -L/root/openwrt/trunk/staging_dir/host/lib -lmpc -lmpfr -lgmp -rdynamic -ldl -lstdc++ -L../zlib -lz
    错误提示
    collect2: ld returned 1 exit status

    求各位提示一下如何解决,。谢谢各位了。

  10. crt1.o:In function ‘__start’:(.text+0xc):undefined reference to ‘main’ 怎么解决啊?谢谢~

  11. 内容过时了。根本编译不过。cp wrtnode_standard.config .config在make oldconfig。在一路默认?得到的根本不是7620n。

Comments are closed.