交叉编译
在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)
推荐阅读
-
apache - centos lamp必须自己编译php吗?
-
Python使用dis模块把Python反编译为字节码的用法详解
-
编译安装PHP出现configure: error: mysql configure failed. Plea_PHP教程
-
程序中的注释部分是否参加编译?
-
破解.net程序(dll文件)编译和反编译方法_PHP
-
为ant指定编译java源码的jdk版本 JavaAntJDKSUN
-
Centos6.5 编译安装mysql 5.6.16 详细教程
-
Jadu: 将 PHP 编译成 .NET
-
使用Want自动编译Delphi
-
解决pyqt中ui编译成窗体.py中文乱码的问题