交叉编译

2021-08-10  本文已影响0人  一蓑烟雨_龙哥

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 路径, 自动寻找头文件。

上一篇下一篇

猜你喜欢

热点阅读