美文网首页
交叉编译

交叉编译

作者: 一蓑烟雨_龙哥 | 来源:发表于2021-08-10 04:00 被阅读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 路径, 自动寻找头文件。
    
    

    相关文章

      网友评论

          本文标题:交叉编译

          本文链接:https://www.haomeiwen.com/subject/kdxxbltx.html