工具说明

  • addr2line 把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。
  • ar 建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。
  • as 主要用来编译GNU C编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。
  • c++filt 连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。
  • gprof 显示程序调用段的各种数据。
  • ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。
  • nm 列出目标文件中的符号。
  • objcopy 把一种目标文件中的内容复制到另一种类型的目标文件中。
  • objdump 显示一个或者更多目标文件的信息。使用选项来控制其显示的信息,它所显示的信息通常只有编写编译工具的人才感兴趣。
  • ranlib 产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。
  • readelf 显示elf格式可执行文件的信息。
  • size 列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。
  • strings 打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符。这个程序对于了解非文本文件的内容很有帮助。
  • strip 丢弃目标文件中的全部或者特定符号。

make 环境变量

见 https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

通用脚本

 #ANDROID_HOME目录下存在交叉编译工具链toolchain目录,由make-standalone-toolchain.sh生成
# 各cpu架构的参数见下方
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=arm --install-dir=./toolchain
export TOOL=arm-linux-androideabi
export ANDROID_HOME=`pwd`
export TOOLCHAIN=$ANDROID_HOME/toolchain
export PATH=$TOOLCHAIN/bin:$PATH
export PKG_CONFIG_LIBDIR=$TOOLCHAIN/lib/pkgconfig
export CC=$TOOLCHAIN/bin/$TOOL-gcc
export CXX=$TOOLCHAIN/bin/$TOOL-g++
export LINK=$CXX
export LD=$TOOLCHAIN/bin/$TOOL-ld
export AR=$TOOLCHAIN/bin/$TOOL-ar
export AS=$TOOLCHAIN/bin/$TOOL-as
export NM=$TOOLCHAIN/bin/$TOOL-nm
export RANLIB=$TOOLCHAIN/bin/$TOOL-ranlib
export STRIP=$TOOLCHAIN/bin/$TOOL-strip
export OBJDUMP=$TOOLCHAIN/bin/$TOOL-objdump
export OBJCOPE=$TOOLCHAIN/bin/$TOOL-objcopy
export ADDR2LINE=$TOOLCHAIN/bin/$TOOL-addr2line
export ELFEDIT=$TOOLCHAIN/bin/$TOOL-elfedit
export READELF=$TOOLCHAIN/bin/$TOOL-readelf
export SIZE=$TOOLCHAIN/bin/$TOOL-size
export STRINGS=$TOOLCHAIN/bin/$TOOL-strings
# 各cpu架构的参数见下方
export ARCH_FLAGS="-mthumb"
export ARCH_LINK=
export CFLAGS="${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64"
export CXXFLAGS="${CFLAGS} -frtti -fexceptions"
export LDFLAGS="${ARCH_LINK}"
export ARFLAGS=
export LIBS=
#CFLAGS:表示用于 C 编译器的选项。
#如指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。
#CXXFLAGS:表示用于 C++ 编译器的选项。
#如执行三级优化 CXXFLAGS="-O3"
#LDFLAGS:gcc 等编译器会用到的一些链接参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它却是说找不到,可以将那个包的lib路径加入的LDFALGS中试一下。
#LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv -llibz -llog
#LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件
autoreconf -i
./configure --prefix=$TOOLCHAIN/sysroot/usr/local \
--with-sysroot=$TOOLCHAIN/sysroot \
# --host=$TOOL \
# --enable-shared \
# --enable-static \
# --disable-shared \
# --disable-static
make -j4
make install
make uninstall

armeabi

 $ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=arm --install-dir=./toolchain
export TOOL=arm-linux-androideabi
export ARCH_FLAGS="-mthumb"
export ARCH_LINK=

armeabi-v7a

 $ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=arm --install-dir=./toolchain
export TOOL=arm-linux-androideabi
export ARCH_FLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
export ARCH_LINK="-march=armv7-a -Wl,--fix-cortex-a8"

arm64-v8a

 $ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=arm64 --install-dir=./toolchain
export TOOL=aarch64-linux-android
export ARCH_FLAGS=
export ARCH_LINK=

x86

 $ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=x86 --install-dir=./toolchain
export TOOL=i686-linux-android
export ARCH_FLAGS="-march=i686 -msse3 -mstackrealign -mfpmath=sse"
export ARCH_LINK=

x86_64

 $ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=x86_64 --install-dir=./toolchain
export TOOL="x86_64-linux-android"
export ARCH_FLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"
export ARCH_LINK=""

mips

 $ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=mips --install-dir=./toolchain
export TOOL=mipsel-linux-android
export ARCH_FLAGS=
export ARCH_LINK=

mips64

 $ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=mips64 --install-dir=./toolchain
export TOOL=mips64el-linux-android
export ARCH_FLAGS=
export ARCH_LINK=

使用方法:

首先使用脚本编译出工具链,而后在运行工具之前先export进行配置,再运行工具链直接编译即可

NDK编译常用命令及不同版本so编译方法的更多相关文章

  1. ubuntu的一些常用命令,测试版本:Ubuntu 12.04.5 LTS

    最近配置了一台Linux服务器,选用的是Ubuntu 12.04.5 LTS版本. 把之前放在Windows Server 2003上的网站移到了现在的服务器上,给我的感受用一个字形容:真JB快! 网 ...

  2. kubectl 最新常用命令 --V1.24版本

    Kubectl 自动补全 BASH source <(kubectl completion bash) # 在 bash 中设置当前 shell 的自动补全,要先安装 bash-completi ...

  3. adb常用命令和抓取log的方法

    一 adb常用的几个命令1. 查看设备adb devices这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示 C:\Documents and Settings\ ...

  4. Linux命令 -- 查看系统版本的各种方法

    适用于CentOS

  5. centos常用命令

    应用程序->附件->终端 一:使用CentOS常用命令查看cpumore /proc/cpuinfo | grep "model name"   grep " ...

  6. CentOS 常用命令大全

    下面,就给大家介绍这些CentOS常用命令. 一:使用CentOS常用命令查看cpu more /proc/cpuinfo | grep "model name" grep &qu ...

  7. CentOS常用命令大全

    一:使用CentOS常用命令查看cpumore /proc/cpuinfo | grep "model name" grep "model name" /pro ...

  8. CentOS常用命令备忘

    1. 查看进程 ps -a 杀掉进程 kill PID 2. 添加计划任务crontab -e 例如:30 21 * * * service httpd restart 每天21:30重启apache ...

  9. 转载-SVN常用命令

    SVN(Subversion)是一个自由.开源的项目源代码版本控制工具.目前,绝大多数开源软件和企业代码管理,都使用SVN作为代码版本管理软件. Subversion将文件存放在中心版本库里,这个版本 ...

随机推荐

  1. 服务器配置多版本CUDA、CUdnn(不同Linux账户使用不同CUDA、CUdnn版本)

    一.由于实验室大家使用的CUDA.CUdnn不同,所以需要在同一台服务器安装多个版本,而且要不引起冲突,方法如下: 1.一般来说CUDA安装在 /usr/local 目录下(当然你可以通过“echo ...

  2. go语言之进阶篇通过select实现斐波那契数列

    一.select作用 Go里面提供了一个关键字select,通过select可以监听channel上的数据流动. select的用法与switch语言非常类似,由select开始一个新的选择块,每个选 ...

  3. JS 判断上传 文件 大小

    随着HTML5 的发展,我们可以用file控件的size属性来获取客户端 上传文件的大小,但是 我今天测试 发现IE10支持,IE11的某个版本不支持, 于是就借用img控件来加载一此, 以此来获取文 ...

  4. 如何让我domain里的机器都跟domain controller的时间保持一致?

    貌似是应该先在PDC上设一个时间源服务器, 然后, 再让domain里所有的机器都去与PDC去sync时间即可. 可是笔者的环境里, 怎么都配不同, 我觉得可能是实验室的网络有什么特别的设置吧. 不管 ...

  5. 构建-0 Gradle DSL 属性和方法【API】

    Android Plugin DSL Reference This is the DSL reference for Android Gradle Plugin. Start reading by f ...

  6. Qt5.3.1 静态编译的configure

    今天最终自己静态编译过了QT5.3.1, 成功用在项目上了, 记录下configure指令.  configure -confirm-license -opensource -platform win ...

  7. 【Kafka】Kafka-分区数-备份数-如何设置-怎么确定-怎么修改

    Kafka-分区数-备份数-如何设置-怎么确定-怎么修改 kafka partition 数量 更新_百度搜索 kafka重新分配partition - - CSDN博客 如何为Kafka集群选择合适 ...

  8. 强化学习之Q-learning简介

    https://blog.csdn.net/Young_Gy/article/details/73485518 强化学习在alphago中大放异彩,本文将简要介绍强化学习的一种q-learning.先 ...

  9. (转)Unity原厂讲师大解密

    本文转载自:http://nedwu13.blogspot.tw/2013_11_01_archive.html   Asset Bundle工作流程及人物換裝實例 - 劉剛 Unity內部的資源有兩 ...

  10. (转)Esfog_UnityShader教程_UnityShader语法实例浅析

    距离上次首篇前言已经有一段时间了,一直比较忙,今天是周末不可以再拖了,经过我一段时间的考虑,我决定这一系列的教程会避免过于深入细节,一来可以避免一些同学被误导,二来会避免文章过于冗长难读, 三来可以让 ...