iperf3 arm交叉编译补充

【Android免费音乐下载app】【佳语音乐下载】写这个app完全出于对个人爱好。建议最少2.0.3版本
https://gitlab.com/gaopinqiang/checkversion/raw/master/Music_Download.apk
在这里插入图片描述

下面是记录iperf3源码在linux下使用android ndk交叉编译可执行文件的步骤。

系统版本:【cat /proc/version】
Linux szxphispra14104 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

系统位数:【uname -a】
Linux version 4.4.0-62-generic (buildd@lcy01-30) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017

1、iperf3源码下载地址;
下载地址:http://software.es.net/iperf/news.html#iperf-3-7-released

2、下载ndk包
下载地址:https://developer.android.google.cn/ndk/downloads/
最新的是 android-ndk-r21-linux-x86_64.zip ,这个里面是使用clang编译的。编译中遇到问题。暂时使用之前版本使用gcc编译。
使用的ndk版本为:android-ndk-r14b-linux-x86_64.zip

3、将ndk解压到linux的/data01/ndk/目录中
因为这个压缩文件有800M,需要分卷。将所有分卷ftp下载到本地【get file】.
多个分卷合并成一个【cat android-ndk-r14b.z* > android-ndk-r14b-combo.zip】
root:@pcname:/data01/ndk/#

zip解压命令【unzip android-ndk-r14b-combo.zip】

4、配置环境变量
【vi /etc/profile】
在文件的末尾加上

export NDK=/data01/ndk/android-ndk-r14b
export NDK_CROSS=/data01/ndk/AndroidToolChain/bin
PATH= $ PATH:$ NDK:$ NDK_CROSS
说明下,由于编辑器问题,$是没有空格的

配置完成使其立即生效【source /etc/profile】
说明:在profile配置的是永久环境变量,如果在命令行使用export NDK=/data01/ndk/android-ndk-r14b 是临时的,这个会话结束就失效了。
NDK_CROSS这个是交叉编译工具链的路径

5、生成工具链

【$NDK/build/tools/make-standalone-toolchain.sh --platform=android-23
–arch=arm --install-dir=/data01/ndk/AndroidToolChain/】

如果不是第一次配置就加上 --force参数,例如:
【$NDK/build/tools/make-standalone-toolchain.sh --platform=android-23 --arch=arm --install-dir=/data01/ndk/AndroidToolChain/ --force】

这个时候就自动创建好 /data01/ndk/AndroidToolChain/ 这个目录

如果执行上面的命令没有权限,就使用chmod配置下,例如:
【chmod 777 $NDK/build/tools/make-standalone-toolchain.sh】
将目录及其子目录下的所有文件添加权限命令【chmod -R 777 *】

6、查看交叉编译环境是否OK,可以查看下gcc版本
【arm-linux-androideabi-gcc -v】

Using built-in specs.
COLLECT_GCC=arm-linux-androideabi-gcc
COLLECT_LTO_WRAPPER=/data01/ndk/AndroidToolChain/bin/…/libexec/gcc/arm-linux-androideabi/4.9.x/lto-wrapper
Target: arm-linux-androideabi
Configured with: /usr/local/google/buildbot/src/android/gcc/toolchain/build/…/gcc/gcc-4.9/configure --prefix=/tmp/59719db9ae19ff43aef46bbcb79596b6 --target=arm-linux-androideabi --host=x86_64-linux-gnu --build=x86_64-linux-gnu --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --with-gmp=/buildbot/tmp/build/toolchain/temp-install --with-mpfr=/buildbot/tmp/build/toolchain/temp-install --with-mpc=/buildbot/tmp/build/toolchain/temp-install --with-cloog=/buildbot/tmp/build/toolchain/temp-install --with-isl=/buildbot/tmp/build/toolchain/temp-install --with-ppl=/buildbot/tmp/build/toolchain/temp-install --disable-ppl-version-check --disable-cloog-version-check --disable-isl-version-check --enable-cloog-backend=isl --with-host-libstdcxx=’-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm’ --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 --disable-sjlj-exceptions --disable-shared --disable-tls --disable-libitm --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --enable-bionic-libs --enable-libatomic-ifuncs=no --enable-initfini-array --disable-nls --prefix=/tmp/59719db9ae19ff43aef46bbcb79596b6 --with-sysroot=/tmp/59719db9ae19ff43aef46bbcb79596b6/sysroot --with-binutils-version=2.25 --with-mpfr-version=3.1.1 --with-mpc-version=1.0.1 --with-gmp-version=5.0.5 --with-gcc-version=4.9 --with-gdb-version=none --with-gxx-include-dir=/tmp/59719db9ae19ff43aef46bbcb79596b6/include/c++/4.9.x --with-bugurl=http://source.android.com/source/report-bugs.html --enable-languages=c,c++ --disable-bootstrap --enable-plugins --enable-libgomp --enable-gnu-indirect-function --disable-libsanitizer --enable-gold --enable-threads --enable-eh-frame-hdr-for-static --enable-graphite=yes --with-isl-version=0.11.1 --with-cloog-version=0.18.0 --with-arch=armv5te --program-transform-name=‘s&^&arm-linux-androideabi-&’ --enable-gold=default
Thread model: posix
gcc version 4.9.x 20150123 (prerelease) (GCC)

可以通过一个简单c程序测试
	#include<stdio.h>
	int main(){
		printf("hi,android\n");
		return 0;
	}
【arm-linux-androideabi-gcc test.c -o test】正常应该会输出 test文件出来
【file test】查看就是一个arm类型的文件

如果是linux下使用,就直接使用
【gcc test.c -o test】
【./test】就可以直接运行了

7、将下载好的iperf源码解压到linux本地
tar.gz格式使用tar命令解压
【tar -xvf iperf-3.7.tar.gz】

8、进入iperf目录,输入命令

【./configure --host=arm-linux CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++ CFLAGS="-static -fPIC" CXXFLAGS="-static" LDFLAGS="-pie -fuse-ld=bfd"】

生成Makefile文件

9、编译make
【make】
正常不报错就会在src目录生成iperf3的执行文件

10、正常生成的iperf3在app是运行不起来的,需要改些配置
iperf3.3需要修改net.c

	--#include <sys/fcntl.h> 
	++#include <fcntl.h> 
	
	包名修改
	--tempdir = "/tmp";
	++tempdir = "/data/data/com.example.test";

============================================
编译中遇到的一些问题及解决方法:
1、运行遇到“fatal error: stdio.h: No such file or directory”
安装下这个【sudo apt-get install build-essential】

2、遇到“Linux gnu/stubs-32.h: No such file or directory”
安装下【sudo apt-get install libc6-dev-i386】

后面发现这个搜索的库是用到/usr/include/里面,其实ndk中有这些文件的。具体修改默认的搜索路径还不清楚。

正常make打印没有看到-I/usr/include ,但是有问题的就会有。说明有问题的make编译并没有从ndk中搜索对应的头文件,导致报错。

通过对比./configure 后的输出文件。生成的Makefile文件和config.status文件内容不一样。通过测试发现修改config.status里面的配置(使用Compare对比)

3、修改config.status文件编译通过,修改点

	a.通过vi的【/OPENSSL】定位
		S["OPENSSL_LDFLAGS"]="-L/usr/lib"
		S["OPENSSL_LIBS"]="-lssl -lcrypto"
		S["OPENSSL_INCLUDES"]="-I/usr/include"
	修改为:
		S["OPENSSL_LDFLAGS"]=""
		S["OPENSSL_LIBS"]=""
		S["OPENSSL_INCLUDES"]=""
		
	b.通过vi的【/CPPFLAGS】定位
		S["CPPFLAGS"]="-I/usr/include "
		S["LDFLAGS"]="-pie -fuse-ld=bfd -L/usr/lib"
	修改为:
		S["CPPFLAGS"]=" "
		S["LDFLAGS"]="-pie -fuse-ld=bfd "
	
	c.
		S["LIBS"]="-lssl -lcrypto -lm "
	修改为:
		S["LIBS"]=" -lm "
		
	再次make成功。
	如果不成功可以尝试【make distclean】 再运行【./configure ...】,修改config.status配置,  【make】

========================================
编译过程中使用到的一些linux命令和vi命令
vi一些实用操作命令

  • 设置显示行号【:set nu】
  • 跳转到文件指定行【:100】
  • 跳转到指定字符位置【/keyword】n查看下一个结果,N查看上一个结果

linux一些实用的操作命令

  • 压缩命令【tar -czvf test.tar.gz test】

  • 查找一个文件的路径【find / -name test.c】

  • 查看已安装的软件【dpkg --list】

  • 配置环境变量【export PATH=/data01/android-ndk/AndroidToolChain/bin:$PATH】

  • 安装软件【sudo apt-get install gcc-arm-linux-gnueabi】

  • 卸载软件

    【sudo apt-get --purge remove gcc-arm-linux-gnueabi】卸载并删除配置
    【sudo apt-get autoremove gcc-arm-linux-gnueabi】卸载并删除依赖包

  • 查看命令路径位置【whereis arm-linux-androideabi-gcc】

  • 查看环境变量【export -p】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章