OpenWrt固件编译、软件包Ipk的编译详解

本文详细介绍了如何在Ubuntu环境下编译OpenWrt固件和软件包Ipk。从更新系统、安装必备软件,到下载OpenWrt源码、配置编译选项、解决编译问题,再到SDK编译和源码编译IPK包的步骤,为读者提供了一份完整的编译指南。编译过程中强调了备份dl目录以节省时间,并指出SDK编译可能存在的问题,推荐使用源码编译方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenWrt固件编译


一.准备阶段

    1.首先你先得有个Linux环境,我使用的是Ubuntu14.04系统。然后把系统的下载源更新一下,这样接下来下载软件会快很多。

      更新源参考: http://chenrongya.blog.163.com/blog/static/8747419620143185103297/

    2.安装一下辅助用的必需软件包

  
  
  1. sudo apt-get install g++
    sudo apt-get install libncurses5-dev
    sudo apt-get install zlib1g-dev
    sudo apt-get install bison
    sudo apt-get install flex
    sudo apt-get install unzip
    sudo apt-get install autoconf
    sudo apt-get install gawk
    sudo apt-get install make
    sudo apt-get install gettext
    sudo apt-get install gcc
    sudo apt-get install binutils
    sudo apt-get install patch
    sudo apt-get install bzip2
    sudo apt-get install libz-dev
    sudo apt-get install asciidoc
    sudo apt-get install subversion
    sudo apt-get install sphinxsearch
    sudo apt-get install libtool
    sudo apt-get install sphinx-common
    sudo apt-get install mercurial


二. 下载openwrt 源码并且编译


      这一步是最关键的,无论是固件编译或者是软件包Ipk的编译都要经过这一步。当然,这一步也是最复杂的最容易出错的。

      1.下载源码

          源码分为好几个版本,有开发板Trunk和稳定版本,新手强烈建议用稳定版,因为Trunk版有bug容易出错。这里使用的是14.07 branch (Barrier Breaker) 

          下载链接见:https://dev.openwrt.org/wiki/GetSource

  
  
  1. mkdir  openwrt
    cd openwrt
    git clone git://git.openwrt.org/14.07/openwrt.git

         下载完的源码大概如下图所示:

        


    2.更新扩展,安装扩展

   

  
  
  1. ./scripts/feeds update -a
    ./scripts/feeds install -a

   3.检查编译环境


  
  
  1. make defconfig

   4.进入配置界面定制固件和组件

      这个步骤是最容易困惑新手的 ,下边会详细介绍细节。

  
  
  1. make menuconfig

      运行上边这条命令之后,便会弹出一个配置界面,在这个配置界面,用户可以自定义勾选自己所需要的组件,像Web管理界面--->Luci,像抓包工具--->iwcap,像网卡管理工具--->iw,等等;除此之外,用户还可以勾选是否编译开发可以用到的SDK包,还可以选择平台的芯片等等。

     在每个选项前,勾选M表示编译但不固化到固件里边,勾选*表示编译并且固化到固件里边。


     例如下图,我是在 TP-LINK TL-WR703N上做开发,

                     于是我的Target System 选择了(Atheros AR7XXX/AR9XXX),Subtarget选了Generic,Target Profile 选了 TP-LINK TL-WR703N;

                      另外,由于我想用到SDK,所以顺便也勾选了Build the Openwrt SDK ;

                      同时,由于需要用到web管理界面,所以我在LuCI下边也勾选了luci;

                      需要用到抓包工具iwcap,所以在Utilities下勾选了

          


         


        



        总之,按照自己的需要去勾选相应的选项就是了。



      5.开始编译

        编译是一个漫长曲折的过程,期间需要从网上下载大量的软件源码到本地,要命的是这些软件源码都是国外的网站上的,没办法只能翻墙了。怎么翻墙这个你懂的。


       编译你可以直接

     

  
  
  1. make 或者 make V=s  或者 make  V=99  (他们的区别无意深究)

       或者编译并且打印一些log信息 (建议)

  
  
  1. make -j1 V=99


       第一次编译一般要花两到三个小时,第二次之后就快了,因为软件包都下载好了= = 。

       编译过程往往遇到很多问题,注意看编译中断后打印的log信息,一般会提示一些error,然后自己寻藤摸瓜看看问题,一般都是系统少了某个软件(例如hg)、网络太差、VPN断了等等原因。。。


       上边说的是标准的编译流程,下边说点投机取巧的事儿。

       其实为啥编译耗时这么长,无非就是下载软件包太特么慢了。而所有的软件包都是放在源码的dl目录的。所以,你可以做这些事:

        1)编译成功后及时备份自己的dl目录,以后要编译什么就省事啦;

        2)自己手动新建dl目录,然后直接复制别人的dl目录过来用,他山之石可以攻玉 = = 



 6.编译结束

    等你最后看到这个画面,恭喜你成功了~~

   

    


    然后你所需要的固件在  openwrt/bin/下边,包括   xxxxx.factory.bin 和 xxxxx.sysupgrade.bin 两个包,至于这两个包怎么刷进板子上,网上这种教程一大把。

    另外你所需要的SDK包也在 openwrt/bin目录下边,是一个  xxxxx.tar.bz2 的压缩包。

    另外你所需要的软件安装包IPK文件也在这个目录下,具体自己搜索下就可以找到了。说了这么多废话。。。


    如图:


    两个固件包和SDK包

   


   ipk包


    


   



下边再细说下 软件安装包ipk的编译方法

方法主要有两种:1) SDK编译  2)源码编译


1.SDK编译软件安装包IPK

   从上边的教程我们已经可以看到怎么去获得SDK包了,然后怎么使用这个包,看教程:

   http://my.oschina.net/hevakelcj/blog/410633


   这个教程已经详实地介绍了编译的步骤,步骤是没有问题的。但是!SDK编译比较坑,就算你完全正确,他就是给你报错,我就死在了下图这个错误上:

     

   意思是makefile 32行前边少了个Tab,但是无论是怎么改,他就是报错 = = 所有努力都是徒劳无意义的。

   同样的代码同样的makefile,在用源码编译的方法是完全可行的。

   所以,强烈采用源码编译而不是SDK编译。

2.源码编译软件安装包IPK

  前边的教程已经讲到怎么编译出ipk包了,其实就是那个步骤,下边讲讲怎么写自己package,下边以helloworld为例:

 

  先创建自己的包目录,以及外层makefile:

  

  
  
  1. mkdir helloworld
    cd helloworld
    mkdir src
    vi makefile

 然后在这个makefile里边填写如下内容,(内容可以参考官网的说明)


  
  
  1.  
    include $(TOPDIR)/rules.mk
     
    # Name and release number of this package
    PKG_NAME:=helloworld
    PKG_RELEASE:=1
     
     
    PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
     
     
    include $(INCLUDE_DIR)/package.mk
     
    define Package/helloworld
           SECTION:=utils
           CATEGORY:=Utilities
           TITLE:=helloworld -- prints a snarky message
    endef
     
     
    # Uncomment portion below for Kamikaze and delete DESCRIPTION variable above
    define Package/helloworld/description
           It is Duval`s demo.
    endef
    define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
    endef
     
    #define Build/Compile
    # $(MAKE) -C $(PKG_BUILD_DIR) \
    # $(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include"
    #endef
     
    define Package/helloworld/install
    $(INSTALL_DIR) $(1)/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
    endef
     
     
    $(eval $(call BuildPackage,helloworld))

然后 进入src,去编写helloworld.C

  
  
  1. cd src
    vi helloworld.c

helloworld.c 里边填写

  
  
  1. #include<stdio.h>
    int main(void)
    {
    printf("yyyy\n");
    return 0;
    }

为helloworld.c编写makefile

  
  
  1. vi makefile

makefile 里边填写

  
  
  1. # build helloworld executable when user executes "make"  
     
    helloworld: helloworld.o  
       $(CC) $(LDFLAGS) helloworld.o -o helloworld  
     
    helloworld.o: helloworld.c  
       $(CC) $(CFLAGS) -c helloworld.c  
     
    # remove object files and executable when user executes "make clean"  
    clean:  
       rm *.o helloworld  

然后把 这个helloworld的package包拷贝到源码的./package目录下边。

然后运行

  
  
  1. make defconfig
    make menuconfig

然后在 menuconfig的菜单中找到helloworld,具体是菜单那里,就看你外层makefile怎么写的。然后找到后在前边勾选M ,表示仅编译不固化到固件中。



然后运行编译

  
  
  1. make -j1 V=s

最后在bin目录下可以找到自己要的ipk包。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值