[关闭]
@aod321 2019-01-06T10:47:35.000000Z 字数 3812 阅读 336

Openwrt交叉编译环境搭建

Openwrt 交叉编译


示范环境

目标主机硬件:newifi mini
编译宿主机系统: Ubuntu 16.04.5 x64(用的是一台旧金山的远程VPS)
CPU :mt7620n
系统版本:openwrt 15.05.01
实例:
1.交叉编译shadowsocks-libev.ipk
2.交叉编译简单的HelloWord
3.交叉编译自己的IPK (留给你当课后作业,自学吧)

注意事项

本文所有操作均以root用户操作,事实上openwrt官方并不推荐这种方式来编译,而是推荐先创建个普通用户然后实施操作

交叉编译环境搭建

安装编译依赖

  1. #Centos系统
  2. yum groupinstall 'Development Tools'
  3. yum install -y git-core subversion binutils bzip2 gcc gcc-c++ gawk gettext flex unzip gawk ccache
  4. yum install -y ncurses-devel zlib-devel make patch unzip perl-ExtUtils-MakeMaker
  5. yum install -y glibc glibc-devel glibc-static quilt ncurses-lib sed sdcc intltool sharutils bison wget
  1. #ubunut系统
  2. sudo apt-get update
  3. sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip gawk ccache

下载工具链

  1. wget http://archive.openwrt.org/chaos_calmer/15.05.1/ramips/mt7620/OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2

解压

  1. tar -xjvf OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2

设置环境变量

  1. # SDK在用户目录下,这里我们假设你是root用户
  2. export STAGING_DIR=/root/OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
  3. export PATH=$PATH:$STAGING_DIR/bin

测试一下环境变量有没有添加成功,在任意目录下执行

  1. mipsel-openwrt-linux-gcc

提示

  1. mipsel-openwrt-linux-gcc: fatal error: no input files
  2. compilation terminated.

即为配置成功

更新feeds

  1. cd OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64
  2. ./scripts/feeds update -a
  3. ./scripts/feeds install -a

这步可能会有几个warning,不用管它

  1. make menuconfig

一切正常就会进入熟悉的选择界面,这里只是测试一下,进去后先退出来
下面进行对具体的IPK包进行交叉编译

交叉编译Hellowrod程序

  1. #创建目录
  2. mkdir helloworld
  3. cd helloworld
  4. #创建源码文件
  5. touch helloworld.c

helloworld.c的内容如下:

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. printf("Hello, world!\n");
  5. return 0;
  6. }

这个问题很简单,只要我们在本机用openwrt提供的编译器来编译我们的程序便可.完整工具链在SDK目录下的staging_dir下,这里我们需要的gcc编译器在SDK对应工具链的bin目录下

  1. #设置环境变量,如果上面已经设置过请忽略
  2. export STAGING_DIR=/root/OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
  3. export PATH=$PATH:$STAGING_DIR/bin
  4. #编译
  5. cd ~/helloworld
  6. mipsel-openwrt-linux-gcc hellowrod.c -o hello.o

交叉编译shadowsocks-libev

说明

本来想随便举个例子,结果用的是最新的shadowsocks-libev,在旧系统上的SDK上编译新版的SS遇到了一系列的坑,主要包括:

所以按照本教程编出来的SS最好把mbedtls,libsodium-1.0.11的ipk也连着SS一起传上去安装

安装mbed TLS

  1. #进入到SDK目录下,输入
  2. svn checkout https://github.com/wongsyrone/lede-1/trunk/package/libs/mbedtls package/libs/mbedtls

libsodium更新

本文编译的shadowsocks-libev版本比较新,为了支持chacha20-ietf,libsodium的版本必须大于1.0.6,但是15.05默认的MakeFile却是1.0.2,所以这里需要解决libsodium的版本问题
以下方法可以将libsodium更新到1.0.11

解决方案

手动方法:对feeds/packages/libs/libsodium/Makefile文件进行修改版本号,下载链接,Hash值,前缀等操作,详细的懒得写了,参考上传的修改后Makefile吧

用修改过的MakeFile去替换原来的Makefile

  1. mkdir newMakefile
  2. cd newMakefile
  3. https://github.com/aod321/packages/raw/master/libs/libsodium/Makefile
  4. cp -f Makefile ~/OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/feeds/packages/libs/libsodium/Makefile

编译最新shadowsocks-libev for openwrt

  1. #进入SDK目录
  2. cd OpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/
  3. # 添加 feeds
  4. git clone https://github.com/shadowsocks/openwrt-feeds.git package/feeds
  5. # 获取 shadowsocks-libev Makefile
  6. git clone https://github.com/shadowsocks/openwrt-shadowsocks.git package/shadowsocks-libev
  7. # 选择要编译的包 Network -> shadowsocks-libev
  8. make menuconfig
  9. # 开始编译
  10. make package/shadowsocks-libev/compile V=99

编译完成后在/bin/ramips/packages/base目录下将编译好的libmbedtls.ipk,libsodium-1.0.11.ipk,和shadowsocks的ipk上传到路由器同一目录下安装即可.

可能会出现的问题及解决方法

问题1

make menuconfig这里可能会出现一个错误

错误信息:

  1. 'feeds/base/package/utils/busybox/config/Config.in:818: glob failed: No files found "package/utils/busybox/config/libbb/Config.in"'

解决方案

在SDK目录下输入

  1. ln -s ../feeds/base/package/utils package/utils

如需要交叉编译shadowsocksR,请参考如下

Refrence

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注