C++构建
一般来讲,写完c++的源文件(src),就需要去编译为:
- 可执行文件
- 动态库/静态库
那么就遇到了几个问题:
- 编译的主机是什么
- 代码运行的目标平台是什么
主机
一般来讲工作的机器,Windows或者Linux,推荐Linux,问题少
目标平台
这个有Windows,Linux,Android,主要是Linux和Android
构造规则
-
CMakeLists:一般自己写CMakeLists,然后使用的工具是cmake(将规则转化为makefile,由make去构建),make(将makefile里面的规则提供给gcc,由gcc编译),gcc(不止可以处理c++,还可以处理C、C++、Objective-C、Fortran等),此外,g++一般用作c++的编译器,gcc用作c的编译器;所以源代码与真正的编译器之间(gcc g++)存在着cmake与make;默认是gcc编译器
-
Android.mk:地位跟CMakeLists相似,里面定义了哪些是源文件,哪些是依赖,写好之后,执行
ndk-build
进行编译;默认情况下,ndk-build使用GCC编译器,但是你也可以使用Clang编译器。在Android.mk文件中,你可以通过设置LOCAL_CLANG
变量来指定使用Clang编译器,或者通过设置LOCAL_TOOLCHAIN
变量来指定使用其他编译器。实际上也是使用了makefile -
Android.bp:可以理解为升级版的Android.mk,是将Android.bp文件转换成ninja格文件来编译,Blueprint文件来描述构建规则,也就是使用Blueprint框架来解析,最终转换成Ninja文件,再有相应的编译器编译;最终,Ninja文件才是真正直接控制源码编译的工具
自己的理解
:
- 如果是linux下的,直接使用cmake make即可编译出
- 如果要编译Android,可以使用cmake make(此时需要有对应的ndk,并且在环境中指明),好像是cmake时就指定toolchain
- 当然可以直接使用ndk-build对Android.mk文件进行处理,命令ndk-build会直接查找当前路径下的android.mk文件
- 最后一种,就是借助Android源码(AOSP)进行编译,此时一般来说自己的项目只是作为一个组件,需要有一个Android.bp文件来告诉编译规则,命令为mm之类的
C++编译
以上是构建项目时用到的工具,具体的编译器都有默认值,也都可以手动指定
编译器
- gcc
- clang
一些层级关系
Linux——
- cmake——可以生成makefile或者ninja,2种格式的构建文件
- 处理对象:cmakelists
- make,ninja:ninja更快
- makefile,buleprint
安卓——
- soong——生成ninja构建文件
- 处理对象:android.bp
- ndk-build
- 处理对象:android.mk
编译器——
- gcc,clang
注意
有可能一个项目中,既有Android.mk
文件,又有BUILD
文件,还有Android.bp
文件,那么:
- 在Android源码下
当执行mm
命令时,如果当前目录下存在Android.bp
文件,则会使用Soong
构建系统进行构建,否则会使用Make
构建系统进行构建,此时会寻找Android.mk
或BUILD
文件。因此,如果存在Android.bp
文件,则会优先使用Soong
构建系统进行构建。
- 在Android源码下无
Android.bp
如果同时存在Android.mk
和BUILD
文件,执行mm
命令时会优先使用BUILD
文件进行构建。这是因为BUILD
文件是Soong
构建系统使用的构建文件,而Android.mk
是Make
构建系统使用的构建文件。Soong
构建系统是Make
构建系统的替代品,它的设计目标是提供更好的构建速度和可维护性。因此,如果存在BUILD
文件,则建议使用Soong
构建系统进行构建。
- 使用
ndk-build
当使用ndk-build
进行构建时,会优先使用Android.mk
文件进行构建。Android.mk
是ndk-build
使用的构建文件,它是基于Make
构建系统的。如果同时存在Android.mk
和BUILD
文件,ndk-build
会忽略BUILD
文件,而使用Android.mk
文件进行构建。因此,如果使用ndk-build
进行构建,需要使用Android.mk
文件来描述构建过程。
注意有时候单独的Android.mk
是不够的,有可能需要另一个Application.mk
进行配合,例如:
APP_PLATFORM := android-21
APP_ABI := arm64-v8a
APP_DEBUG := true
APP_STRIP_MODE := none
APP_OPTIM := debug
APP_STL := c++_shared
APP_ALLOW_MISSING_DEPS=true
安卓自带了androidmk
工具,用于将Android.mk
文件转化为Android.bp
文件,一般在一任意一次编译之后(编译Android.bp),会在路径下出现,执行:
/home/xxx/project/CI/out/host/linux-x86/bin/androidmk Android.mk > Android.bp
就可以得到需要的bp文件