欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

交叉编译

程序员文章站 2022-05-22 19:52:57
...

在android开发的时候需要经常编译第三方c库文件,可你编译的时候在电脑 运行在adnroid上,所以需要交叉编译实现。

–sysroot 的作用

如果在编译时指定了-sysroot就是为编译时指定了逻辑目录。编译过程中需要引用的库,头文件,如果要到/usr/include目录下去找的情况下,则会在前面加上逻辑目录。这里可以简单的理解我需要目标平台系统的某个文件这时候我可以同过这个地址去获取

如此处我们指定 -sysroot=/home/shell.albert/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root

则如果在编译过程中需要找stdio.h,则会用/usr/include/目录下去找,因为我们指定了系统目录,则会到下面的路径去找。

–cross-prefix/CC

交叉工具链地址
我们需要用这个工具链条去编译我们的C代码
假设我们编译的是android平台。那么这个工具链地址如下

D:\Android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-

其中上述路径的最后一个arm-linux-androideabi-的由来如下:

在D:\Android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin 目录下我们会看到如下很多工具

交叉编译

这么多工具你只需在调用configure(很多c库都是用这个文件去进行编译配置)写名工具前缀即可,他需要哪些编译器他会自己拼接
如我们在编译X264的时候的脚本:

#!/bin/sh
ANDROID_NDK="/home/fmy/android-ndk-r14b"
SDK_VERSION=21
#ARCH=arm64
ARCH=arm

if [ "$ARCH" = "arm64" ]
then
    PLATFORM_PREFIX="aarch64-linux-android-"
    HOST="aarch64"
    PLATFORM_VERSION=4.9
else
    PLATFORM_PREFIX="arm-linux-androideabi-"
    HOST="arm"
    PLATFORM_VERSION=4.9
fi

PREFIX=$(pwd)/android/${ARCH}
SYSROOT=$ANDROID_NDK/platforms/android-${SDK_VERSION}/arch-${ARCH}
TOOLCHAIN=$ANDROID_NDK/toolchains/${PLATFORM_PREFIX}${PLATFORM_VERSION}/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/${PLATFORM_PREFIX}


./configure \
    --prefix=$PREFIX \
    --cross-prefix=$CROSS_PREFIX \
    --sysroot=$SYSROOT \
    --enable-static \
    --enable-pic \
    --disable-asm \
    --host=arm-linux \

make 
make install

我们再写编译脚本的时候写了前缀PLATFORM_PREFIX变量为aarch64-linux-android-,这时候我们编译器需要gcc编译器的时候它会自动拼接为 aarch64-linux-android-gcc,这时候我们回过头来再看看NDK交叉工具连下的文件
(D:\Android\android-ndk-r9d\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin)
交叉编译

参考http://blog.chinaunix.net/uid-8107907-id-2034159.html