CMake,Make,MakeFile的区别

理解CMake、Make和Makefile的区别,以及如何将它们应用于Unity的原生库自动化构建,确实能提升开发效率。下面我将用一个对比表格来清晰展示它们的核心关系,然后详细说明在Unity中的具体应用。

特性 Makefile Make CMake
角色 构建脚本 构建执行器 构建系统生成器
核心功能 定义编译规则(目标、依赖、命令) 解析Makefile并执行其中命令,调用编译器 根据平台无关的配置(CMakeLists.txt)生成特定平台的构建文件(如Makefile)
输入文件 Makefilemakefile Makefilemakefile CMakeLists.txt
跨平台性 弱(需为不同平台编写不同规则) 弱(依赖Makefile的规则) (一份CMakeLists.txt可为Windows、macOS、Linux等生成对应项目文件)
易用性与灵活性 语法相对简单直接,但依赖关系需手动维护,项目复杂时难以管理 灵活,但功能受限于具体的Makefile 学习曲线稍陡,但能自动处理依赖,非常适合中大型、跨平台项目
典型应用场景 小型或中型项目,特别是在Unix-like系统上;快速原型开发 与Makefile配合使用,是实际执行编译、链接等操作的底层工具 大型跨平台项目;需要集成多个第三方库的项目;作为高级抽象层,简化构建过程

🔧 三者在Unity原生库构建中的应用

在Unity中开发需要调用C/C++编写的原生库(如 .so.a.dll)时,CMake、Make和Makefile可以协同工作,实现从源码到Unity可用的库文件的自动化构建。

构建流程与分工

  1. 编写构建配置(CMake):使用 CMakeLists.txt描述你的原生库项目,包括源文件、编译选项、目标平台(例如通过交叉编译工具链针对Android或iOS进行配置)。CMake的优势在于可以方便地指定针对不同手机处理器架构(如arm64-v8a)的编译设置
  2. 生成构建脚本(CMake):运行CMake命令(例如 cmake -S . -B build),它会根据你的 CMakeLists.txt和当前目标平台,生成对应的 Makefile(在Linux/macOS上)或Visual Studio项目文件(在Windows上)
  3. 执行编译(Make):在生成 Makefile的目录下,运行 make命令。Make这个工具会读取 Makefile中的具体指令,调用编译器(如gcc、clang)和链接器,最终生成 .so.a等库文件
  4. 集成到Unity:将编译好的原生库文件放入Unity项目的正确目录,例如 Assets/Plugins/AndroidAssets/Plugins/iOS。随后在C#脚本中使用 DllImport属性来调用库中的函数

实现自动化构建

将上述步骤脚本化,即可融入CI/CD(持续集成/持续部署)管道,实现自动化

  • 使用脚本串联流程:可以编写一个Shell脚本(Linux/macOS)或批处理脚本(Windows),按顺序执行CMake配置、Make编译、以及将生成的库文件复制到指定Unity插件目录的命令。
  • 在CI/CD中调用:在GitHub Actions、Jenkins等CI/CD工具中,可以配置一个任务(Job),在代码推送后自动执行这个构建脚本,完成原生库的编译和部署