Linux 交叉编译过程

交叉编译的前期比较痛苦,为了能让这个过程比较顺利,更好的了解整个过程,还是买一个服务器比较

设备准备
1.服务器 或者 mac 或者 Ubuntu

  1. root 后的手机

查看手机cup架构
需要手机root 权限
先执行 adb shell
再执行 cat /prof/cpuinfo

下载 ndk
https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip?hl=zh-cn
wget 命令下载

下载完成后修改文件名 这里是为了去掉zip 后面的无用字符
mv android-ndk-r17c-linux-x86_64.zip?hl=zh-cn android-ndk-r17c-linux-x86_64.zip

使用unzip 解压ndk

使用vim 执行在测试目录下随便创建一个main.c 文件,接下来我们就按照流程打一个 arm 的 exe 执行文件

linux 编译exe 执行文件指令

gcc main.c -o mainEXE

但是这个包是无法提供给andorid 使用的,想要让android 能够使用,需要利用ndk 的交叉编译

交叉编译问题及解决办法

问题1:寻找 ndk 的gcc

目录 在ndk 下面的 toolchains 目录下面
-->
/root/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

注意:这里需要选择cpu架构,需要按照指定的cpu架构使用

配置环境变量后,即可方便使用

此时定义的环境变量

export NDK="/root/NDK/android-ndk-r17c"

export android_target="android-26"

export NDK_ARM_GCC="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"

export NDK_ARM64_GCC="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc"

export NDK_X86_GCC="$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc"

编译命令如下
$NDK_ARM_GCC main.c -o mainEXE

问题2: 使用 ndk 的 gcc 在编译过程中找不到 <stdio.h>

原因是没有导入lib.so 的头文件与 库文件,需要将头文件与库文件放入到目录下

头文件目录-->android-ndk-r17c/sysroot/usr/include

库文件目录-->android-ndk-r17c/platforms/android-26/arch-arm/usr/lib

注意库文件需要根据cpu 架构与 android 的版本选择 我选择的是android 26 与 arm 的架构

环境变量新增如下配置

export NDK_CFIG_x86="--sysroot=NDK/platforms/android_target/arch-x86 -isystem $NDK/sysroot/usr/include"

export NDK_CFIG_arm="--sysroot=NDK/platforms/android_target/arch-arm -isystem $NDK/sysroot/usr/include"

export NDK_CFIG_arm64="--sysroot=NDK/platforms/android_target/arch-arm64 -isystem $NDK/sysroot/usr/include"

export NDK_ARM_COMMEND="NDK_ARM_GCCNDK_CFIG_arm"

export NDK_ARM64_COMMEND="NDK_ARM64_GCCNDK_CFIG_arm64"

export NDK_X86_COMMEND="NDK_X86_GCCNDK_CFIG_x86"

编译命令如下
$NDK_ARM_COMMEND main.c -o mainEXE

问题3:在ndk gcc 编译过程 找不到 <asm/type.h>

asm 的目录在ndk 的 sysroot/usr/include 目录下 在这里需要选择cpu架构,我选择arm的架构
所以他的目录就是
/root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi

修改环境变量配置
export NDK_CFIG_x86="--sysroot=NDK/platforms/android_target/arch-x86 -isystem NDK/sysroot/usr/include -isystemNDK/sysroot/usr/include/i686-linux-android"

export NDK_CFIG_arm="--sysroot=NDK/platforms/android_target/arch-arm -isystem NDK/sysroot/usr/include -isystemNDK/sysroot/usr/include/arm-linux-androideabi"

export NDK_CFIG_arm64="--sysroot=NDK/platforms/android_target/arch-arm64 -isystem NDK/sysroot/usr/include -isystemNDK/sysroot/usr/include/aarch64-linux-android"

编译命令如下
$NDK_ARM_COMMEND main.c -o mainEXE

问题4:将打包出来的执行文件给android 使用过程中提示 需要新增 -PIE 参数

编译命令修改如下
$NDK_ARM_COMMEND -pie main.c -o mainEXE

这次编译执行文件在android 系统运行成功

接下来就需要打包 shared 动态库

动态库linux编译指令是

gcc -fPIC -shared 文件名 -o libxxx.so

根据上面的配置交叉编译的指令为

$NDK_ARM_COMMEND -fPIC -shared get.c -o libgetarm.so

动态库打包成功

静态库打包

打包静态库需要先打包 .o文件,linux 指令如下
gcc -fPIC -c get.c -o get.o

使用get.o 打包get.c 文件,注意这里git.o 需要放在后面
ar -rcs -o get.a get.o

修改后获取.o文件的交叉编译指令如下
$NDK_ARM_COMMEND -fPIC -c get.c -o libget.o

ndk 的 ar 工具 与gcc 在共一个目录下面
需要新增环境变量

export NDK_AR_ARM="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar"

export NDK_AR_ARM64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"

export NDK_AR_X86="$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ar"

修改后的编译指令为
$NDK_AR_ARM rcs -o libget.a libget.o

成功后使用sz将 .a文件与 .so文件保存在桌面就可以开始使用了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容