C++构建与编译

C++构建

一般来讲,写完c++的源文件(src),就需要去编译为:

  1. 可执行文件
  2. 动态库/静态库

那么就遇到了几个问题:

  1. 编译的主机是什么
  2. 代码运行的目标平台是什么

主机

一般来讲工作的机器,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.mkBUILD文件。因此,如果存在Android.bp文件,则会优先使用Soong构建系统进行构建。

  • 在Android源码下无Android.bp

如果同时存在Android.mkBUILD文件,执行mm命令时会优先使用BUILD文件进行构建。这是因为BUILD文件是Soong构建系统使用的构建文件,而Android.mkMake构建系统使用的构建文件。Soong构建系统是Make构建系统的替代品,它的设计目标是提供更好的构建速度和可维护性。因此,如果存在BUILD文件,则建议使用Soong构建系统进行构建。

  • 使用ndk-build

当使用ndk-build进行构建时,会优先使用Android.mk文件进行构建。Android.mkndk-build使用的构建文件,它是基于Make构建系统的。如果同时存在Android.mkBUILD文件,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文件

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值