编译环境

  • digitalocean新加坡节点
  • swap=5G(为了防止编译时内存不足
  • ubuntu(14.04x64)edition(16.04官方的wiki依赖有变化,有些包失效了

安装和准备(As root)

  • 一大堆的依赖:

    1
    2
    3
    4
    5
    6
    7
    apt-get install autoconf automake bash bison bzip2 diffutils file flex m4 \
    g++ gawk groff-base libncurses-dev libtool libslang2 make patch perl pkg-config \
    shtool subversion tar texinfo zlib1g zlib1g-dev git-core gettext libexpat1-dev \
    libssl-dev cvs gperf unzip python libxml-parser-perl gcc-multilib gconf-editor \
    libxml2-dev g++-4.4 g++-multilib gitk libncurses5 mtd-utils libncurses5-dev \
    libstdc++6-4.4-dev libvorbis-dev g++-4.4-multilib git autopoint autogen sed \
    build-essential intltool libelf1:i386 libglib2.0-dev
  • x64版本需要:

    1
    sudo apt-get install lib32z1-dev lib32stdc++6
  • 下载到指定位置(这里是/root)

    1
    2
    cd /root
    git clone https://github.com/RMerl/asuswrt-merlin.git
  • 处理环境

    1
    2
    sudo ln -s ~/asuswrt-merlin/tools/brcm /opt/brcm
    sudo ln -s ~/asuswrt-merlin/release/src-rt-6.x.4708/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3 /opt/brcm-arm
1
export PATH=$PATH:/opt/brcm/hndtools-mipsel-linux/bin:/opt/brcm/hndtools-mipsel-uclibc/bin:/opt/brcm-arm/bin

编译Netkeeper(以我的AC-56U为例)

1
cd ~/asuswrt-merlin/release/src-rt-6.x.4708 && make clean
  • 下载Openwrt-NetKeeper源码
    1
    git clone https://github.com/miao1007/Openwrt-NetKeeper.git

修改makefile里面location的PATH为如下内容

1
2
LOCATION=../../toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3
CC=$(LOCATION)/bin/arm-brcm-linux-uclibcgnueabi-gcc

准备就绪,make all编译,提示如下错误

1
2
/root/asuswrt-merlin/release/src-rt-6.x.4708/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin/../libexec/gcc/arm-brcm-linux-uclibcgnueabi/4.5.3/cc1: error while loading shared libraries: libmpc.so.2: cannot open shared object file: No such file or directory
make: *** [chongqing_sxplugin] Error 1

按照提示看来是某个库没有好好处理
键入:ldd /opt/brcm-arm/libexec/gcc/arm-brcm-linux-uclibcgnueabi/4.5.3/cc1得到如下信息

1
2
3
4
5
6
7
8
linux-gate.so.1 =>  (0xf779b000)
libmpc.so.2 => not found
libmpfr.so.4 => not found
libgmp.so.10 => not found
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7784000)
libelf.so.1 => /usr/lib/i386-linux-gnu/libelf.so.1 (0xf776c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf75bc000)
/lib/ld-linux.so.2 (0x56596000)

看来是PATH没设置好,在/opt/brcm-arm/lib目录下有需要的so文件,但没有默认指向这个文件夹,那就设置一下

1
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/brcm-arm/lib:/usr/local/lib:/usr/lib

键入:ldd /opt/brcm-arm/libexec/gcc/arm-brcm-linux-uclibcgnueabi/4.5.3/cc1得到如下信息:

1
2
3
4
5
6
7
8
9
linux-gate.so.1 =>  (0xf774e000)
libmpc.so.2 => /opt/brcm-arm/lib/libmpc.so.2 (0xf7736000)
libmpfr.so.4 => /opt/brcm-arm/lib/libmpfr.so.4 (0xf76e6000)
libgmp.so.10 => /opt/brcm-arm/lib/libgmp.so.10 (0xf7689000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7678000)
libelf.so.1 => /usr/lib/i386-linux-gnu/libelf.so.1 (0xf7660000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf74b0000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7469000)
/lib/ld-linux.so.2 (0x565ff000)

最后再make all一下,正常编译出来结果


最后说明,其实在搜寻的时候,默认会只搜寻/usr/local/lib:/usr/lib这两个地址,所以很多的时候存在缺少文件的提示,上面的文件错误提示也能通过ln -s /opt/brcm-arm/lib/libmpc.so.2 /usr/local/lib/libmpc.so.2来解决。