总结一发NDK交叉编译的套路

工具说明

  • 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

通用脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#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

1
2
3
4
$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

1
2
3
4
$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

1
2
3
4
$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

1
2
3
4
$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

1
2
3
4
$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

1
2
3
4
$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

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

NDK 交叉编译常用变量相关推荐

  1. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  2. 【Android NDK 开发】NDK 交叉编译 ( NDK 函数库目录 | Linux 交叉编译环境搭建 | 指定头文件目录 | 指定函数库目录 | 编译 Android 命令行可执行文件 )

    文章目录 I . NDK platforms 目录下的 函数库 II . Ubuntu 配置 NDK 交叉编译环境 III . 同时指定编译的头文件和库文件 IV . 指定编译的头文件 V . 指定编 ...

  3. CURL NDK 交叉编译

    移植curl到android,且支持https和http2.0 依赖前两篇文章 libnghttp2 NDK 交叉编译 openssl NDK 交叉编译 创建工作目录,并进入 1 2 mkdir an ...

  4. CMake 安卓NDK编译常用语法

    目录 CMake 安卓NDK编译常用语法 CMake版本 设置项目名称 平台 32&64 路径相关配置 设置生成动态库文件 常用的编译和链接选项 编译选项 `CMAKE_CCXX_FLAGS_ ...

  5. android ndk交叉编译pcl 1.9.1

    目录 android ndk交叉编译pcl 1.9.1 依赖库 android ndk 下载 使用cmake交叉编译lib库 编译pcl 完整的android studio cmake配置代码 and ...

  6. cmake 常用变量和常用环境变量查表手册

    cmake 常用变量和常用环境变量查表手册 一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定 ...

  7. NDK交叉编译及so库导入Android项目

    前言 记录 NDK交叉编译及so库导入Android项目 的简单步骤,以备后续用到时查看. 环境 在Linux和Mac环境下,分别编译输出so库. Red Hat Enterprise Linux 8 ...

  8. 【Tools】cmake 常用变量和常用环境变量查表手册---整理

    原文链接:https://blog.csdn.net/gubenpeiyuan/article/details/8667279 一.cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量 ...

  9. cmake学习(二)常用变量和常用环境变量

    一.变量的引用方式是使用"${}",在IF中,不需要使用这种方式,直接使用变量名即可 二.自定义变量使用SET(OBJ_NAME xxxx),使用时${OBJ_NAME} 三.cm ...

最新文章

  1. Ubuntu make menuconfig与make xconfig
  2. C 语言读写中文出现乱码
  3. 2.2.5 调度算法:时间片轮转 优先级调度 多级反馈队列
  4. solr定时实时重建索引和增量更新
  5. ubuntu mysql5.6_ubuntu安装mysql5.6
  6. Spring boot + maven
  7. 常见Markdown编辑博客中段落文字标记(浅红色且具有底色)怎么弄的?
  8. 64位树莓派运行linux,树莓派3B+安装64位debian GUN/Linux系统
  9. 20 个很棒的 jQuery Mobile 教程
  10. 改变计算机界的存储解决方案:RAID,30岁生日快乐!
  11. 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(二)之分库分表路由...
  12. 如何在H264数据中获取PTS?
  13. 英语四六级听力无线转发系统
  14. vb.net教程 3-1 窗体编程基础 1
  15. 在html中如何批量操作系统,网刻批量操作系统
  16. 微信小程序登录-开发文档
  17. 41款非常有创意的卡通图标大全可爱
  18. itunes备份电脑C盘内存不够怎么办?
  19. Clouda 之我见
  20. 自学Java笔记2 2021-3-28更

热门文章

  1. 用 CSS 做轮播图
  2. django+mysql 配置一系列问题
  3. 吴恩达 coursera AI 专项三第一课总结+作业答案
  4. linux ftp服务器构建
  5. 转:c/c++ 运行库
  6. Report20201016 benchmark vs袁颖 PANTHER初步模拟结果
  7. 科大星云诗社动态20210212
  8. [云炬python3玩转机器学习笔记] 3-7Numpy中的矩阵运算
  9. 3 个相见恨晚的 Google Colaboratory 奇技淫巧!
  10. faiss(1):简介 安装 与 原理