n2n 的交叉编译(用于 Openwrt)

前情提要可以看 n2n 的简单介绍。显然这个内网穿透应用需要长期在线运行,而为了能远程访问,最常见的能安心放在学校等地 24x7 运行的设备就是路由器或是树莓派了。树莓派用的是 Linux 系统,路由器用的主要是 Openwrt 和 LEDE。本文就将讨论在 Openwrt / LEDE 平台运行的 n2n 的编译。

交叉编译

在路由器上安装开发工具并编译程序显然不是很合适,毕竟 Flash 存储空间和 CPU 性能都极为有限,所以比较合适的编译方法就是在 Linux 平台上进行交叉编译。下面以 AR71xx 平台上的 Openwrt 为例,使用操作系统为 CentOS x64。

所需代码及依赖

编译步骤

获得 toolchain

  1. 创建开发用的目录并进入,这里选择的是用户主目录

    1
    $ cd ~
  2. 解压 SDK

    1
    $ tar jxvf OpenWrt-SDK-15.05.1-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2
  3. 提取 Toolchain

    1
    $ mv OpenWrt-SDK-15.05.1-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/ ~/mips_34kc_gcc
  4. 修改环境变量 vi ~/.bash_profile,增加如下代码:

    1
    2
    3
    4
    5
    6
    ...
    PATH=~/mips_34kc_gcc/bin:$PATH
    export PATH
    STAGING_DIR=~/mips_34kc_gcc
    export STAGING_DIR
    ...
  5. 引入环境变量

    1
    $ source ~/.bash_profile

编译 OpenSSL

  1. 解压代码并进入项目目录

    1
    2
    $ tar zxvf openssl-1.0.2l.tar.gz
    $ cd openssl-1.0.2l
  2. 执行设置脚本

    1
    $ ./config no-asm shared --prefix=~/mips_34kc_gcc
  3. 修改 MakeFile 文件 vi Makefile,搜索并修改下列部分:

    1
    2
    3
    4
    5
    6
    7
    ...
    CC= mips-openwrt-linux-gcc
    ...
    AR= mips-openwrt-linux-ar $(ARFLAGS) r
    RANLIB= mips-openwrt-linux-ranlib
    ...
    NM= mips-openwrt-linux-nm

    同时要删除文件里的 -m64 后缀(共两处)。

  4. 编译并安装
    1
    $ make && make install

编译 n2n

  1. 下载代码并进入项目目录

    1
    2
    $ git clone https://github.com/meyerd/n2n.git
    $ cd n2n/n2n-v2
  2. 修改 CMake 配置文件 vi CMakeLists.txt,在开头添加如下内容:

    1
    2
    3
    4
    SET(CMAKE_SYSTEM_NAME Linux)
    SET(CMAME_C_COMPILER mips-openwrt-linux-gcc)
    SET(CMAKE_CXX_COMPILER mips-openwrt-linux-g++)
    SET(CMAKE_FIND_ROOT_PATH ~/mips_34kc_gcc)
  3. 在 CMake 配置文件里添加链接库选项 -ldl

    1
    $ sed -i 's/ n2n)/ n2n dl)/g' CMakeLists.txt
  4. 新建 build 文件夹,用来存放编译出来的文件:

    1
    2
    $ mkdir build
    $ cd build
  5. 进行 CMake 设置,进行编译:

    1
    2
    $ cmake ..
    $ make
  6. 至此在目录里就生成了 supernodeedge 的二进制文件,传到路由器里就可以正常执行了。

参考

https://www.yjblog.net/post/123.html
http://bbs.csdn.net/topics/392137961
http://blog.csdn.net/clirus/article/details/50151427
http://blog.csdn.net/idjoy/article/details/39908437