在一个脚本(
make_cross_platform.sh)中实现交叉编译.
特性:
- 支持跨平台一键编译, 例如:
./make_cross_platform.sh rk3308 Release- 自动查找库及其资源、头文件, 第三方库和头文件统一放到
src/third_party/库名文件夹下.
支持编译后自动拷贝各个库依赖的资源到部署目录下.- 自动查找第三方库变量设为
CACHE的, 避免一个project多个子模块单独依赖造成的多次查找问题.- 自动添加当前目录到当前模块的
target_include_dicrectories中, 由于是public的, 依赖此模块的也能自动获得.- 脚本支持自动查找cmake/ninja/ndk路径. 支持检测环境变量,若不存在使用兜底路径,具体可以看编译脚本里的配置.
- 支持编译安卓时选择stl:
c++_static或gnustl_static, 并自动选择对应的库(例如:armeabi-v7a_release_gnustl_static).
默认不带stl名称的文件夹的库(例如armeabi-v7a_release)是c++_static编译的, 这也是Android默认编译的stl类型.- 支持windows编译脚本编译传递vs版本, 以及编译时自动选择对应vs版本的库目录(例如:
x32_debug_vs2022).- 在开启
PRJ_BUILD_ALL_IN_ONE且编译动态库时, 会自动将ALL_IN_ONE依赖的子模块编译的库类型改为STATIC,
这样就可以将各个子模块代码打包进动态库中.- 在windows msvc下抑制LNK4099警告:依赖的库缺少pdb调试信息.
- 项目C/CXX编译选项分开: 若在定义lib库时没有定义编译选项, 自动选择
PRJ_COMPILE_OPTIONS和PRJ_CXX_COMPILE_OPTIONS.- 支持单元测试(
prj_cc_test()), 可以给每个模块编写单独的测试用例.- 更新 lcu 库到最新开发版.
- 3rdparty_reference 第三方库源码:不参与自动化编译,
- 请将编译好的库放入
src/third_party/库名称/lib/<ARCH_TYPE>_<BUILD_TYPE>目录下. - 第三方库之所以不采用自动化依赖编译是因为每次改动代码都一起编译太耗费时间, 一般来说第三方库不怎么需要做改动.
- 请将编译好的库放入
- cmake 依赖脚本: cmake所需的脚本及函数, 以及工具链.
- doc 文档
- src 源码
- api 对外接口实现模块
- common 通用工具模块 (建议项目其他模块都依赖此模块获取封装常用的函数调用)
- config 配置管理模块
- example 测试工具源码
- jni 安卓JNI实现模块,包装C/C++接口成JNI接口
- third_party 三方库:放置第三方库/头文件及资源 (一个三方库一个文件夹, 参见本项目示例)
- work_flow 工作流流转模块: 输入数据(api层规整后传入到此模块), 在内部模块之间流转,
通过回调抛出处理结果给api层, 由api层规整对外的输入输出数据.
- tool 工具:编译临时目录、发布目录等等
- build 编译目录, 例如使用cmake生成的工程就在这里
- deploy 部署发布目录
- bin 编译产物输出目录
- res 依赖的库的资源或配置
支持4种BUILD_TYPE:
Debug,Release,MinSizeRel,RelWithDebInfo
编译参数 释义 备注 PRJ_ENABLE_ASAN 是否启用 Address SanitizerDebug编译模式默认启用, 其他编译模式默认不启用 PRJ_HIDDEN_SYMBOLS 是否隐藏内部函数符号(但在 exports.def/exportx.exp指定的除外)Debug模式不启用, 其他编译模式启用
-
windows:
支持选择编译
Win32还是Win64.
自动检测并使用系统安装的最新 Visual Studio 版本:make_windows.bat Win32 Debug
指定
Visual Studio版本(首先确保系统里已安装对应版本):make_windows.bat Win64 Debug "Visual Studio 14 2015 Win64" make_windows.bat Win32 Release "Visual Studio 14 2015" make_windows.bat Win32 MinSizeRel "Visual Studio 16 2019" make_windows.bat Win64 RelWithDebInfo "Visual Studio 16 2019"
-
android:
支持编译不同的
ANDROID_PLATFORM_ABI及ANDROID_STL(c++_static/gnustl_static).
默认不加stl参数则使用的是c++_static# 编译 v7a abi Debug, 使用 c++_static make_android.bat armeabi-v7a Debug make_android.bat arm64-v8a Release # 编译 v7a abi MinSizeRel, 使用 gnustl_static make_android.bat armeabi-v7a MinSizeRel gnustl_static make_android.bat arm64-v8a RelWithDebInfo gnustl_static make_android.bat x86_64 Release
-
linux 及其他平台(交叉编译):
这里的linux指的是本机宿主机, 通常是 x86_64 linux 系统.
如需交叉编译, 需先在cmake/toolchains/下新建对应平台的交叉编译文件(用于描述编译链位置及编译参数).例如:
linaro7.5.0arm64编译链, 则在cmake/toolchains/下新建linaro7.5.0.toolchain.cmake交叉编译文件,
并在里面按照cmake语法写上编译器位置及该平台必要的编译参数(如果没有就不写), 具体的写法参考本项目cmake/toolchains/里的示例.# 编译64位linux make_cross_platform.sh linux m64 Release "-DPRJ_ENABLE_ASAN=OFF -DPRJ_HIDDEN_SYMBOLS=OFF" # 编译32位linux (如果宿主机是64位系统, 还需要安装32位相关的库才可以编译成功) make_cross_platform.sh linux m32 Release "-DPRJ_ENABLE_ASAN=OFF -DPRJ_HIDDEN_SYMBOLS=OFF" # 编译 linaro7.5.0 arm64 make_cross_platform.sh linaro7.5.0 Release "-DPRJ_ENABLE_ASAN=OFF -DPRJ_HIDDEN_SYMBOLS=OFF" # 编译 r328 make_cross_platform.sh r328 Release "-DPRJ_ENABLE_ASAN=OFF -DPRJ_HIDDEN_SYMBOLS=OFF"
-
编译产物:
编译输出产物位于
tool/deploy/bin/<PLATFORM>_<ABI>_<BUILD_TYPE>下.
例如:- 在
windows x32 debug编译模式下, 输出文件夹为:tool/deploy/bin/windows_x32_debug - 在
linux x64 release编译模式下, 输出文件夹为:tool/deploy/bin/linux_x64_release - 在
linaro7.5.0 x64 release编译模式下, 输出文件夹为:tool/deploy/bin/linaro7.5.0_x64_release
- 在
使用
githooks约束规范化提交信息(commit-msg):修改
.git/config: 使hooksPath指向根目录的.githooks文件夹[core] hooksPath = .githooks