找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 4630|回复: 9

[N1盒子] 【小白教程】使用交叉编译工具为N1小钢炮编译软件

[复制链接]
发表于 2019-4-3 12:23 | 显示全部楼层 |阅读模式
本帖最后由 lcsuper 于 2019-4-3 13:31 编辑

一、前言
1、自己改了一个aria2的源码编译后在openwrt上跑了1年多还算稳定。但是7621的性能还是捉急,文件多了就崩,速度10M也崩。N1算的上最有性价比的arm机器了,性能肯定高过7621。灯大出了小钢炮固件后,立马入了一个专门跑下载解放路由器。固件自带aria2,ssh上去aria2c -v看到这个版本是由aarch64-buildroot-gnu编译的。放狗得知,aarch64是ARM CPU ARMv8架构64位的执行状态。buildroot是个自动化工具,可以根据自己的需要定制Linux系统。下了个buildroot,跟着教程menuconfig后发现很像openwrt编译固件,先选CPU,文件系统,内核,第三方软件.......然而,作为从来没有编译过固件的小白来说一脸懵逼。我的经验也仅限于使用openwrtSDK编译软件的基础上。其次,发现buildroot里面第三方软件库没有aria2,要自行添加到库里面再编译。看了下教程,要自己写makefile,这超出小白能力范围,GG。其次,发现buildroot在交叉编译其他平台软件的时候,可以使用自己生成的交叉编译工具或者使用第三方交叉编译工具。又aria2c -v看了一下,发现灯大好像是用的第三方交叉编译工具gcc-linaro-aarch64-linux-gnu编译的固件。于是,想尝试一下使用第三方交叉编译工具来编译一下aria2。
2、交叉编译是个神马鬼
我们写的源码在linux系统下经过编译器gcc、g++编译成二进制代码后才能在机器上运行。make命令就是这个过程。但是这样编译出的软件只能在当前本机所使用的平台类型使用,你复制到硬件和系统都和这一样的平台才能使用。就是说同一个源码,在X86架构CPU Ubuntu64位系统下编译的软件,不能在X86CPU windows系统上运行,不能在mips架构 CPU上跑,不能在arm架构cpu上跑。
为了解决这个问题,就有了交叉编译。我在X86 CPU Linux系统下使用目标平台的专用交叉编译器,就可以将代码编译成目标平台能使用的软件。比如gcc-linaro-aarch64-linux-gnu编译器就是专门在X86 CPU Linux平台下面,编译ARM ARMv8架构 64位CPU平台下软件的编译器。
3、一般交叉编译过程
跟平常我们make源码一样。只是我们要指定编译器为专门的交叉编译器。软件所使用的所有库文件,都必须先用交叉编译器提前编译。就像我们编译openwrt的时候需要先安装环境。
4、编译的关键
关键就是makefile文件。他告诉了编译器必须的参数。但是aria2是可以多平台编译的,所以他的makefile不是固定的,是通过autoreconf根据平台架构系统的因素自动化配置出来的。看了下autoreconf的模板configure.ac文件,只有windows平台,Android平台,树莓派平台。
通过研究aria2的交叉编译文档,发现树莓派的配置文件是最可能拿来用的,因为都是arm平台的CPU,但是他是通过docker编译安装的。无奈小白才疏学浅搞不定,还好GitHub上的大神多,发现有现成的脚本。
二、操作(感谢GitHub上的veltlion大神提供的教程)

1、安装aria2的编译环境

  1. libgnutls-dev (Required for HTTPS, BitTorrent, Checksum support)
  2. nettle-dev (Required for BitTorrent, Checksum support)
  3. libgmp-dev (Required for BitTorrent)
  4. libssh2-1-dev (Required for SFTP support)
  5. libc-ares-dev (Required for async DNS support)
  6. libxml2-dev (Required for Metalink support)
  7. zlib1g-dev (Required for gzip, deflate decoding support in HTTP)
  8. libsqlite3-dev (Required for Firefox3/Chromium cookie support)
  9. pkg-config (Required to detect installed libraries)
复制代码
2、下载aria2源码解压

3、安装aarch64-linux-gnu交叉编译器,当然你也可以下载使用linaro的编译器

  1. sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu pkg-config-aarch64-linux-gnu
  2. sudo chown $UID -R /usr/aarch64-linux-gnu
  3. sudo mkdir -p /opt/aria2-arm
  4. sudo chown $UID /opt/aria2-arm
复制代码

4、修改静态编译脚本(感谢GitHub的大神q3aql,他的脚本是针对树莓派的,我们稍加修改)

这个脚本用来交叉编译aria2所要使用到的库

  1. #!/bin/bash

  2. # In this configuration, the following dependent libraries are compiled:
  3. #
  4. # * zlib
  5. # * c-ares
  6. # * expat
  7. # * sqlite3
  8. # * openSSL
  9. # * libssh2

  10. #CHECK TOOL FOR DOWNLOAD
  11. aria2c --help > /dev/null
  12. if [ "$?" -eq 0 ] ; then
  13.    DOWNLOADER="aria2c --check-certificate=false"
  14. else
  15.    DOWNLOADER="wget -c"
  16. fi

  17. ## DEPENDENCES ##
  18. ZLIB=http://sourceforge.net/projects/libpng/files/zlib/1.2.11/zlib-1.2.11.tar.gz
  19. OPENSSL=http://www.openssl.org/source/openssl-1.0.2o.tar.gz
  20. EXPAT=https://sourceforge.net/projects/expat/files/expat/2.2.0/expat-2.2.0.tar.bz2
  21. SQLITE3=http://www.sqlite.org/2018/sqlite-autoconf-3230100.tar.gz
  22. C_ARES=http://c-ares.haxx.se/download/c-ares-1.14.0.tar.gz
  23. SSH2=https://www.libssh2.org/download/libssh2-1.7.0.tar.gz

  24. ## CONFIG ##
  25. ARCH="aarch64"
  26. HOST="aarch64-linux-gnu"
  27. PREFIX="/opt/aria2-arm/build_libs"
  28. LOCAL_DIR="/opt/aria2-arm/build_libs"

  29. #TOOL_BIN_DIR="/opt/aria2-arm-rbpi/tools/arm-bcm2708/gcc-linaro-$HOST-raspbian/bin"
  30. #PATH=${TOOL_BIN_DIR}:$PATH

  31. CFLAGS="-march=armv8-a+crypto+crc -mtune=cortex-a53"
  32. DEST="/usr/aarch64-linux-gnu"
  33. CC=$HOST-gcc
  34. CXX=$HOST-g++
  35. LDFLAGS="-L$DEST/lib"
  36. CPPFLAGS="-I$DEST/include"
  37. CXXFLAGS=$CFLAGS
  38. MAKE="make -j`nproc`"
  39. CONFIGURE="./configure --prefix=${LOCAL_DIR} --host=$HOST"
  40. BUILD_DIRECTORY=/tmp/

  41. ## BUILD ##
  42. cd $BUILD_DIRECTORY
  43. #
  44. # zlib build
  45.   $DOWNLOADER $ZLIB
  46.   tar zxvf zlib-1.2.11.tar.gz
  47.   cd zlib-1.2.11/
  48.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc STRIP=$HOST-strip RANLIB=$HOST-ranlib CXX=$HOST-g++ AR=$HOST-ar LD=$HOST-ld ./configure --prefix=$PREFIX --static
  49.   make
  50.   make install
  51. #
  52. # expat build
  53.   cd ..
  54.   $DOWNLOADER $EXPAT
  55.   tar jxvf expat-2.2.0.tar.bz2
  56.   cd expat-2.2.0/
  57.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc CXX=$HOST-g++ ./configure --host=$HOST --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` --prefix=$PREFIX --enable-static=yes --enable-shared=no
  58.   make
  59.   make install
  60. #
  61. # c-ares build
  62.   cd ..
  63.   $DOWNLOADER $C_ARES
  64.   tar zxvf c-ares-1.14.0.tar.gz
  65.   cd c-ares-1.14.0/
  66.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc CXX=$HOST-g++ ./configure --host=$HOST --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` --prefix=$PREFIX --enable-static --disable-shared
  67.   make
  68.   make install
  69. #
  70. # Openssl build
  71.   cd ..
  72.   $DOWNLOADER $OPENSSL
  73.   tar zxvf openssl-1.0.2o.tar.gz
  74.   cd openssl-1.0.2o/
  75.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc CXX=$HOST-g++ ./Configure linux-aarch64 $CFLAGS --prefix=$PREFIX shared zlib zlib-dynamic -D_GNU_SOURCE -D_BSD_SOURCE --with-zlib-lib=$LOCAL_DIR/lib --with-zlib-include=$LOCAL_DIR/include
  76.   make CC=$CC
  77.   make CC=$CC install INSTALLTOP=$DEST OPENSSLDIR=$DEST/ssl
  78. #
  79. # sqlite3
  80.   cd ..
  81.   $DOWNLOADER $SQLITE3
  82.   tar zxvf sqlite-autoconf-3230100.tar.gz
  83.   cd sqlite-autoconf-3230100/
  84.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc CXX=$HOST-g++ ./configure --host=$HOST --prefix=$PREFIX --enable-static --enable-shared --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE`
  85.   make
  86.   make install
  87. #
  88. # libssh2
  89.   cd ..
  90.   $DOWNLOADER $SSH2
  91.   tar zxvf libssh2-1.7.0.tar.gz
  92.   cd libssh2-1.7.0/
  93.   rm -rf $PREFIX/lib/pkgconfig/libssh2.pc
  94.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc CXX=$HOST-g++ AR=$HOST-ar RANLIB=$HOST-ranlib ./configure --host=$HOST --without-libgcrypt --with-openssl --without-wincng --prefix=$PREFIX --enable-static --disable-shared
  95.   make
  96.   make install
  97. #
  98. #cleaning
  99.   cd ..
  100.   rm -rf c-ares*
  101.   rm -rf sqlite-autoconf*
  102.   rm -rf zlib-*
  103.   rm -rf expat-*
  104.   rm -rf openssl-*
  105.   rm -rf libssh2-*
  106. #
  107. echo "finished!"
复制代码
存为aria2lib到aria2文件夹

5、这个脚本是修改confg的,其中打了一个补丁,破解aria2最大128线程

  1. #!/bin/bash

  2. # In this configuration, the following dependent libraries are used:
  3. #
  4. # * zlib
  5. # * c-ares
  6. # * expat
  7. # * sqlite3
  8. # * openSSL
  9. # * libssh2

  10. ##patch##
  11. wget https://aur.archlinux.org/cgit/aur.git/plain/aria2-fast.patch?h=aria2-fast -O aria2-fast.patch
  12. patch -Np1 < aria2-fast.patch

  13. ## CONFIG ##
  14. test -z "$HOST" && HOST=aarch64-linux-gnu
  15. test -z "$PREFIX" && PREFIX=/opt/aria2-arm/build_libs

  16. ARCH="aarch64"
  17. HOST="aarch64-linux-gnu"
  18. PREFIX="/opt/aria2-arm/build_libs"
  19. LOCAL_DIR="/opt/aria2-arm/build_libs"

  20. CFLAGS="-march=armv8-a+crypto+crc -mtune=cortex-a53"
  21. DEST="/usr/aarch64-linux-gnu"
  22. CC=$HOST-gcc
  23. CXX=$HOST-g++
  24. LDFLAGS="-L$DEST/lib"
  25. CPPFLAGS="-I$DEST/include"
  26. CXXFLAGS=$CFLAGS
  27. MAKE="make -j`nproc`"
  28. CONFIGURE="./configure --prefix=${LOCAL_DIR} --host=$HOST"

  29. ./configure \
  30.     --host=$HOST \
  31.     --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
  32.     --prefix=$PREFIX \
  33.     --disable-nls \
  34.     --without-gnutls \
  35.     --with-openssl \
  36.     --without-libxml2 \
  37.     --with-libz --with-libz-prefix=${LOCAL_DIR} \
  38.     --with-libexpat --with-libexpat-prefix=${LOCAL_DIR} \
  39.     --with-slite3 --with-sqlite3-prefix=${LOCAL_DIR} \
  40.     --with-libcares --with-libcares-prefix=${LOCAL_DIR} \
  41.     --with-ca-bundle='/etc/ssl/certs/ca-certificates.crt' \
  42.     LDFLAGS="-L$LOCAL_DIR/lib" \
  43.     PKG_CONFIG_PATH="$LOCAL_DIR/lib/pkgconfig" \
  44.     ARIA2_STATIC=yes
复制代码
存为aria2config到aria2文件夹

6、填Sphinx索引的坑。使用python的asc码和平台用的utf8不一致,会报错
打开usr/lib/python2.7/posixpath.py

在顶上加上

  1. reload(sys)
  2. sys.setdefaultencoding('utf-8')
复制代码

7、进入aria2文件夹,打开终端,一个一个打命令
  1. sudo ./aria2lib
  2. autoreconf -i
  3. sudo ./aria2config
复制代码

以上都不报错就make

在aria2/src下会生成aria2c的文件,因为是静态编译,体积达到了90多兆

8、减小aira2c的体积

  1. aarch64-linux-gnu-strip src/aria2c
复制代码

变成6M多了
9、ssh上传到小钢炮的/usr/bin,覆盖aria2c即可,改新的aria2c为7777
三、后记
1、Ubuntu要装新一些的版本,老版本没有国内镜像源了。。。。。。。官方的我连不上。
2、这个脚本原来是针对树莓派的,仅仅修改了
ARCH="aarch64"
HOST="aarch64-linux-gnu"
CFLAGS="-march=armv8-a+crypto+crc-mtune=cortex-a53"
去掉了原来的TOOL_BIN_DIR 和 PATH
把 linux-armv4 改成 linux-aarch64 。

3、小钢炮现在有docker了装软件方便多了
4、论坛贴的代码吃了不少格式符号,如果报错,请自行去GitHub下载原始脚本改吧(https://github.com/q3aql/aria2-static-builds/tree/master/build-scripts)

我的恩山、我的无线 The best wifi forum is right here.
发表于 2019-4-3 12:50 | 显示全部楼层
感谢老大分享
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2019-4-3 12:56 | 显示全部楼层
挺牛的,折腾了多久啊?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2019-4-3 13:51 | 显示全部楼层
简单问题复杂化了啊。。
我传一个去掉下载限制的版本。

链接:https://eyun.baidu.com/s/3smci4WX 密码:9BTN

改属性为755就可以运行,也可以放/usr/bin代替小钢炮的,我这个把下载16线程限制改成1024了。

点评

我当然不只是改了你这一点代码了,新增了一点功能,还修复一个bug  详情 回复 发表于 2019-4-3 20:16
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2019-4-3 17:46 | 显示全部楼层
感谢,学习了。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2019-4-3 17:48 | 显示全部楼层
牛逼,学习了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2019-4-3 20:16 | 显示全部楼层
本帖最后由 lcsuper 于 2019-4-3 20:17 编辑
lonee 发表于 2019-4-3 13:51
简单问题复杂化了啊。。
我传一个去掉下载限制的版本。

我当然不只是改了这一点代码了,新增了一点功能,还修复一个bug,不重新编译不行
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2019-7-6 20:18 | 显示全部楼层
不错不错,谢谢分享!最近正在尝试交叉编译,准备把privoxy交叉编译个arm64版本出来,再把它dockerfile了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-1-14 14:59 | 显示全部楼层
先标记一下,感谢分享
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2022-3-1 18:32 | 显示全部楼层
不错,编了一个我家云用的1.36版本
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-3-29 13:09

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表