本篇目录
一、前言
本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,linux操作系统基本是同样适用的。
交叉编译就是在A平台编译出可以在B平台执行的文件,对于我们安卓开发者来说交叉编译就是在window或者mac或者linux系统上编译出可在安卓系统上运行的可执行文件,什么时候需要用到交叉编译呢?音视频开发基本都会用到ffmpeg,opengl es等三方库,这时我们就需要在window或者mac或者linux系统上编译出可在安卓系统执行的文件,这里可编译出静态库或者动态库使用,这时候就会用到交叉编译。
本篇虽然是一些基础的知识或者操作,但是对于后续三方库的编译移植,CMake的配置是很重要的,否则后续遇到没用过的三方库你会感觉无从下手编译,很多CMake的配置也只是会配置而不懂具体什么含义。
进行本篇学习请先自己配置好MinGW(C/C++编译器)编译环境并配置到系统环境变量中,这些都是基础的操作,自己查询一下配置好就可以了,此外还需要自己下载好安卓平台提供的交叉编译工具链,下载地址:安卓平台交叉编译工具,我下载的是17c版本的。
好了,进入本文的学习
下文相关代码均来自:相关演示代码
二、常用C/C++编译器了解以及C/C++文件编译过程
常用C/C++编译器
编译器名称 | 描述 |
---|---|
clang | clang 是一个C、C++、Object-C 的轻量级编译器。基于LLVM (LLVM是以C++编写而成的构架编译器的框架系统,可以说是一个用于开发编译器相关的库),对比gcc,它具有编译速度更快、编译产出更小等优点,但是某些软件在使用clang编译时候因为源码中内容的问题会出现错误 |
gcc | GNU C编译器。原本只能处理 C语言,很快扩展,变得可处理 C++`。(GNU计划,又称革奴计划。目标是创建一套完全自由的操作系统) |
g++ | GNU c++编译器,后缀为 .c的源文件,gcc把它当作是C程序,而g++当作是C++程序;后缀为 .cpp`的,两者都会认为是c++程序,g++会自动链接c++标准库stl,gcc不会,gcc不会定义__cplusplus宏,而g++会 |
C/C++文件编译过程
C/C++文件要经过预处理、编译、汇编、和连接才能变成可执行文件。
过程名称 | 主要作用 |
---|---|
预处理 | 预处理阶段主要处理include和define等。它把#include包含进来的.h 文件插入到#include所在的位置,把源程序中使用到的用#define定义的宏用实际的字符串代替 |
编译 | 编译阶段,编译器检查代码的规范性、语法错误等,检查无误后,编译器把代码翻译成汇编语言。 |
汇编 | 汇编阶段把 .s文件翻译成二进制机器指令文件.o,这个阶段接收.c, .i, .s的文件都没有问题 |
连接 | 链接阶段,链接的是其余的函数库,比如我们自己编写的c/c++文件中用到了三方的函数库,在连接阶段就需要连接三方函数库,如果连接不到就会报错 |
比如在命令行中我们执行如下命令:
gcc -o d:\main C:\Users\wanglei55\Desktop\main.c
将C:\Users\wanglei55\Desktop\main.c文件编译为可执行文件,输出到d盘名称为main,整个编译过程就包括预处理、编译、汇编、和连接过程。
以上主要介绍了常用C/C++编译器的区别以及C/C++文件的编译过程,大体了解一下即可。
三、交叉编译
接下来我们具体看一下交叉编译的流程,我们先来看一下window平台怎么编译出可执行文件。
我们编写如下C文件:
main.c
#include <stdio.h>
int main()
{
int nn = 55;
printf("nn = %d\n", nn);
return 0;
}
很简单,就是输出一些信息,接下来我们将main.c用gcc编译器编译为可执行文件,执行如下命令:
gcc -o d:\main C:\Users\wanglei55\Desktop\