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.bp
- Android.bp使用、与Android.mk的区别、对应关系、转换
- Android编译系统中的Android.bp、Blueprint与Soong