一、什么是cmake和makefile
简单来说,CMake 是一个用来生成 Makefile 的工具。它们是构建 C/C++ 项目过程中不同层级的工具,通常配合使用,而不是相互替代。
🧱 Makefile:编译的“施工队”
角色: 它是具体的“执行者”。你用一个叫 make 的工具,根据 Makefile 文件里的详细指令,一步步调用编译器(如 gcc )来编译和链接你的代码。
特点: 你需要手动编写所有编译规则。对于小型项目,这很直接;但对于大型项目,规则会变得非常复杂和冗长。
跨平台性: 较弱。同一个项目,如果要在 Windows 和 Linux 上编译,你可能需要写两份完全不同的 Makefile 。
🛠️ CMake:生成 Makefile 的“总设计师”
角色: 它是“生成器”,不是直接编译工具。你写一个更高层次的配置文件 CMakeLists.txt ,描述项目结构、源文件、依赖库等信息。
特点: CMake 会根据你写的 CMakeLists.txt ,自动生成对应平台的 Makefile (在 Linux 上)或 Visual Studio 项目文件(在 Windows 上)。
跨平台性: 非常强。你只需要维护一份 CMakeLists.txt ,就能在不同平台上生成对应的构建文件,真正做到“一处编写,多处运行”。
🔄 它们是如何协作的?
整个工作流程通常是这样的:
编写 CMakeLists.txt : 你定义项目名、版本、源文件、需要的库等。
运行 cmake 命令: CMake 读取 CMakeLists.txt ,并生成当前平台适用的 Makefile (或其他构建文件)。
运行 make 命令: make 工具读取上一步生成的 Makefile ,执行具体的编译和链接操作,最终生成可执行文件。
🤔 我应该学哪个?
Makefile: 更底层,能让你对编译过程有更精细的控制。在一些小型项目或特定的嵌入式开发中,直接写 Makefile 会更直接。
CMake: 对于中大型项目,或者需要跨平台支持的项目,强烈推荐使用 CMake。它能极大地简化构建流程的维护工作,是现代 C/C++ 项目的主流选择。