1.为啥需要交叉编译?
因为linux 系统上的gcc 在android 系统上没法正常调用,所有需要使用android ndk 中的 gcc
2
2.1 android ndk 使用ndk 17,
2.2 在Linux系统中:
wget https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip?hl=zh_cn
mv xxxx.zip?hl==zh_cn xxx.zip
# 使用mv 将上面的文件修改为 .zip 文件,然后 进行解压
unzip xxxx.zip
在linux 系统中 编写一个简单输出 hello world
[root@sue download]# cat hello.c
#include <stdio.h>
int main(){
printf("Hello world\n");
}
[root@sue download]#
[root@sue download]# gcc hello.c -o mainEXE
[root@sue download]# ./mainEXE
Hello world
[root@sue download]#
虽然上面的 mainEXE 在liux系统上可以运行,但是没法在 android 系统上运行
因为我的手机系统是arm64位的系统,所以选择aarch64-linux-android-4.9
查看手机平台的架构的方式
adb shell
1|HWBMH:/proc $ cat cpuinfo
Processor : AArch64 Processor rev 0 (aarch64)
processor : 0
BogoMIPS : 3.84
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
[root@sue bin]# pwd
/opt/download/android-ndk-r17c/toolchains/aarch64-linux-android4.9/prebuilt/linux-x86_64/bin
使用上面的目录下的
aarch64-linux-android-gcc
[root@sue bin]#
export NDK_GCC="/opt/download/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc "
$NDK_GCC hello.c -o mainNDKEXE
[root@sue download]# export NDK_GCC="/opt/download/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc"
[root@sue download]# $NDK_GCC hello.c -o mainNDKEXE
hello.c:1:19: fatal error: stdio.h: No such file or directory
#include <stdio.h>
^
compilation terminated.
[root@sue download]#
寻找不到头文件和库文件
那就在platforms 中找
/opt/download/android-ndk-r17c/platforms
# --sysroot=路径, (自动寻找头文件和库文件,.h/ .a/.so)
exprot AAA="--sysroot=/opt/download/android-ndk-r17c/platforms/android-21/arch-arm64";
但是上面是头文件有了,库文件还没有,于是还需要找库文件。
/opt/download/android-ndk-r17c/sysroot/usr/include/
exprot AAA="--sysroot=/opt/download/android-ndk-r17c/platforms/android-21/arch-arm64 -isystem /opt/download/android-ndk-r17c/sysroot/usr/include";
[root@sue download]# echo $NDK_GCC
/opt/download/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc
[root@sue download]# echo $AAA
--sysroot=/opt/download/android-ndk-r17c/platforms/android-21/arch-arm64 -isystem /opt/download/android-ndk-r17c/sysroot/usr/include
[root@sue download]#
[root@sue download]# $NDK_GCC $AAA hello.c -o mainNDKEXE
In file included from /opt/download/android-ndk-r17c/sysroot/usr/include/sys/types.h:36:0,
from /opt/download/android-ndk-r17c/sysroot/usr/include/stdio.h:42,
from hello.c:1:
/opt/download/android-ndk-r17c/sysroot/usr/include/linux/types.h:21:23: fatal error: asm/types.h: No such file or directory
#include <asm/types.h>
^
compilation terminated.
看来还需要配置 asm/types.h
/opt/download/android-ndk-r17c/sysroot/usr/include/aarch64-linux-android
于是乎:
export AAA="--sysroot=/opt/download/android-ndk-r17c/platforms/android-21/arch-arm64 -isystem /opt/download/android-ndk-r17c/sysroot/usr/include -isystem /opt/download/android-ndk-r17c/sysroot/usr/include/aarch64-linux-android ";
[root@sue download]# echo $NDK_GCC
[root@sue download]# export NDK_GCC="/opt/download/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc"
[root@sue download]# $NDK_GCC $AAA hello.c -o mainNDKEXE
[root@sue download]#
[root@sue download]# ls -la
上面还有问题,
需要增加-pie
[root@sue download]# $NDK_GCC -pie $AAA hello.c -o mainNDKEXE
完毕。
分析一下:
export NDK_GCC="/opt/download/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc" //需要gcc
export AAA="--sysroot=/opt/download/android-ndk-r17c/platforms/android-21/arch-arm64 【寻找文件头文件】
-isystem /opt/download/android-ndk-r17c/sysroot/usr/include【寻找文件头文件】
-isystem /opt/download/android-ndk-r17c/sysroot/usr/include/aarch64-linux-android ";【运行期 寻找asm】
# --sysroot=路径, (自动寻找头文件和库文件,.h/ .a/.so)
# -isystem 路径, 自动寻找头文件。
网友评论