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】

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