CMake详解
CMake,Make,MakeFile的区别
理解CMake、Make和Makefile的区别,以及如何将它们应用于Unity的原生库自动化构建,确实能提升开发效率。下面我将用一个对比表格来清晰展示它们的核心关系,然后详细说明在Unity中的具体应用。
| 特性 | Makefile | Make | CMake |
|---|---|---|---|
| 角色 | 构建脚本 | 构建执行器 | 构建系统生成器 |
| 核心功能 | 定义编译规则(目标、依赖、命令) | 解析Makefile并执行其中命令,调用编译器 | 根据平台无关的配置(CMakeLists.txt)生成特定平台的构建文件(如Makefile) |
| 输入文件 | Makefile或 makefile |
Makefile或 makefile |
CMakeLists.txt |
| 跨平台性 | 弱(需为不同平台编写不同规则) | 弱(依赖Makefile的规则) | 强(一份CMakeLists.txt可为Windows、macOS、Linux等生成对应项目文件) |
| 易用性与灵活性 | 语法相对简单直接,但依赖关系需手动维护,项目复杂时难以管理 | 灵活,但功能受限于具体的Makefile | 学习曲线稍陡,但能自动处理依赖,非常适合中大型、跨平台项目 |
| 典型应用场景 | 小型或中型项目,特别是在Unix-like系统上;快速原型开发 | 与Makefile配合使用,是实际执行编译、链接等操作的底层工具 | 大型跨平台项目;需要集成多个第三方库的项目;作为高级抽象层,简化构建过程 |
🔧 三者在Unity原生库构建中的应用
在Unity中开发需要调用C/C++编写的原生库(如 .so、.a、.dll)时,CMake、Make和Makefile可以协同工作,实现从源码到Unity可用的库文件的自动化构建。
构建流程与分工
- 编写构建配置(CMake):使用
CMakeLists.txt描述你的原生库项目,包括源文件、编译选项、目标平台(例如通过交叉编译工具链针对Android或iOS进行配置)。CMake的优势在于可以方便地指定针对不同手机处理器架构(如arm64-v8a)的编译设置 - 生成构建脚本(CMake):运行CMake命令(例如
cmake -S . -B build),它会根据你的CMakeLists.txt和当前目标平台,生成对应的Makefile(在Linux/macOS上)或Visual Studio项目文件(在Windows上) - 执行编译(Make):在生成
Makefile的目录下,运行make命令。Make这个工具会读取Makefile中的具体指令,调用编译器(如gcc、clang)和链接器,最终生成.so或.a等库文件 - 集成到Unity:将编译好的原生库文件放入Unity项目的正确目录,例如
Assets/Plugins/Android或Assets/Plugins/iOS。随后在C#脚本中使用DllImport属性来调用库中的函数
实现自动化构建
将上述步骤脚本化,即可融入CI/CD(持续集成/持续部署)管道,实现自动化
- 使用脚本串联流程:可以编写一个Shell脚本(Linux/macOS)或批处理脚本(Windows),按顺序执行CMake配置、Make编译、以及将生成的库文件复制到指定Unity插件目录的命令。
- 在CI/CD中调用:在GitHub Actions、Jenkins等CI/CD工具中,可以配置一个任务(Job),在代码推送后自动执行这个构建脚本,完成原生库的编译和部署
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 岁迹!
