0
点赞
收藏
分享

微信扫一扫

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



文章目录


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




I . NDK platforms 目录下的 函数库


platforms 目录下的函数库:



1 . Android 版本目录 :​ platforms 中存储了各个 Android 版本编译时需要的动态库与静态库资源 , 如 android-29 中就是该版本对应的本地库资源 ;

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



2 . CPU 架构目录 :

在版本目录下存储的是不同的 CPU 处理器对应的库版本 , 如 arm , x86 处理器 , 32 位 与 64 位 等不同版本对应的本地库 ;

CPU 不同 , 其对应的指令集不同 , 相应编译出的动态库或静态库就不同 ;

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


3 . 函数库目录 :



在对应 CPU 目录下的 usr\lib 目录下 , 存储了该 Android 版本对应的 CPU 版本的动态库 与 静态库 ;

开发高性能音频时使用的 libOpenSLES.so , 打印日志使用的 liblog.so 库 , 就是在该目录下 ; 引入的 #include <android/log.h> 头文件对应的方法逻辑实现就在 liblog.so 库中 ;

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




II . Ubuntu 配置 NDK 交叉编译环境


独立使用 NDK 提供的交叉编译工具 , 需要在 Ubuntu Linux 下执行 , 因此这里我们下载 Linux 版本的 NDK ;



1 . NDK 下载地址 :​ ​​https://developer.android.google.cn/ndk/downloads​​


历史版本的 NDK 下载地址 : ​​https://developer.android.google.cn/ndk/downloads/older_releases.html​​




2 . 下载完毕会后在 Ubuntu 中解压文件 :

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



3 . 配置临时环境变量 :



① 目的 :​ 该临时环境变量 就是 NDK 中的交叉编译工具的路径 , 目的是方便调用 ;



② 执行指令 :​ export CC=/home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc



③ CC 环境变量作用 :​ CC 是变量名 , 调用的时候使用 $CC main.c 即可调用上述路径中的 arm-linux-androideabi-gcc 工具编译 main.c 源文件 ;



④ 交叉编译 :​ 上述路径的编译器就是在 Linux 中编译 ARM CPU 指令集的函数库 , 由于是在 X86 芯片上编译 ARM 芯片的函数库 , 因此该操作叫做交叉编译 ;



4 . 尝试交叉编译 :

① main.c 源文件 :

#include <stdio.h>

int main(){
printf("main : test");
return 0;
}

② 尝试编译 :​ 调用 ​​$CC main.c​​ 命令尝试编译 main.c 程序 , 发现如下问题 ;

book@book-virtual-machine:~/NDK$ $CC main.c 
main.c:1:19: fatal error: stdio.h: No such file or directory
#include <stdio.h>
^
compilation terminated.
book@book-virtual-machine:~/NDK$

③ 分析原因 :​ 此处需要提供 stdio.h 对应的头文件与函数库 , 上面连头文件都没有找到 , 需要我们来指定 ;




下面开始说明如何指定头文件与库文件 ;





III . 同时指定编译的头文件和库文件


1 . 库文件 :​ 交叉编译需要的库文件就是上述 NDK platforms 目录下的 函数库 ;



2 . --sysroot 头文件与库文件查找目录设定 :​ 使用 ​​--sysroot=XX​​ 参数设置 ;

指定本次编译的 头文件 与 库文件 , 系统会自动到 XX/usr/include 目录下查找头文件 , 到 XX/usr/lib 目录下查找库文件 ;




IV . 指定编译的头文件


1 . -isysroot 头文件查找目录设定 :​ 使用 ​​-isysroot YY​​ 参数设置 ;

指定头文件查找目录 , 系统还会自动到 YY/usr/include 目录下查找头文件 ;

注意 :​ 该配置会覆盖 ​​--sysroot=XX​​ 参数查找头文件的配置 ;



2 . 同时设置 ​​--sysroot=XX -isysroot=YY​​ 情况 :



如果同时设置了 ​​--sysroot=XX -isysroot=YY​​ 两个参数 ,

会去 XX/usr/lib 目录下找库文件 ,

到 YY/usr/include 目录下查找头文件 ;

( 此时不再去 XX/usr/include 目录下查找头文件 )



3 . -isystem 设置头文件查找路径 :​ 使用 ​​-isystem ZZ​​ 参数设置 ;

设置后系统会直接去 ZZ 目录下查找头文件 ;



4 . -isysroot 与 -isystem 区别 :



两种参数配置的查找路径不同 ,

-isysroot 设定会去设定的目录下的 usr/include 目录下查找 .

-isystem 会直接到设置的目录下查找 ;



5 . -I 头文件查找目录 :​ 使用 ​​-isystem KK​​ 参数设置 ;

设置后系统会直接去 KK 目录下查找头文件 ;



6 . 头文件目录查找优先级 :

优先级从高到底 : -I > -isystem > -isysroot




V . 指定编译的库文件


1 . -L 指定库文件查找目录 :​ 使用 ​​-L AA​​ 参数设置 ;

设置该参数后 , 编译时系统会自动到 AA 目录下查找函数库 ;



2 . -l 指定链接的库名称 :​ 使用 ​​-l libxxx.so​​ 参数设置 ;

设置该参数后 , 系统会按照该路径加载该 libxxx.so 函数库 ;




VI . 指定编译的头文件与库文件 示例


1 . 设置临时环境变量 :

export CC=/home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc



2 . NDK 头文件与库文件的目录 :

( 这里以 android-21 版本 ARM CPU 为例 )



① NDK 库文件目录 :

/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm/user/lib



② NDK 库头文件目录 :

/home/book/NDK/android-ndk-r17c/sysroot/usr/include

/home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi/asm



3 . 最终的指定头文件与函数库的编译指令 :



$CC --sysroot=/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi -pie main.c



命令解析 :



① $CC :​ arm-linux-androideabi-gcc 交叉编译工具的临时环境变量 , 执行 $CC 相当于执行 /home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc 命令 ;

② 指定函数库 :

–sysroot=/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm

指定函数库目录 , 必须这么写 , 因为真正要查找的是下层目录中的 usr/lib 目录 ;



③ 指定头文件 :​ 这里使用的是 -isystem , 不是 -isysroot , 因此目录可以写的随意一些 ;



-isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include

-isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi




isysroot 指定的头文件必须在 usr/include 中 , -isystem 不必 ;




④ 指定需要在 Android 手机执行配置 :​ -pie



4 . 编译结果 :

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



该编译出的 a.out 可执行文件 , 可以在 Android 手机中 , 使用命令行执行 ;

手机必须 root 才可以执行 , 普通手机不能执行 ;



举报

相关推荐

Android-NDK的linux交叉编译环境

0 条评论