当前位置: 首页 > news >正文

CMake + Ninja 构建程序示例

Ninja简介

Ninja 是一种专注于速度的小型构建系统,特别适合用于大型项目的增量编译。它最初由 Google 的工程师为加速 Chromium 浏览器的构建过程而开发,并逐渐成为一种广泛使用的替代构建工具,尤其是在配合 CMake 等高级构建配置工具时。
在这里插入图片描述

主要特点

  1. 高效性:Ninja 专注于尽可能快地执行构建任务,通过并行处理和最小化解析时间来加速构建过程。

  2. 简单性:Ninja 文件格式设计得非常简单直接,旨在快速加载和执行。这与 CMake 这样的工具形成对比,后者生成复杂的构建文件,但依赖于像 Ninja 或 Make 这样的构建系统来实际执行构建。

  3. 跨平台支持:Ninja 支持多种操作系统,包括 Windows、macOS 和 Linux,使其成为一个理想的跨平台构建解决方案。

  4. 作为其他构建系统的后端:许多现代构建系统(如 CMake)可以生成 Ninja 构建文件,利用 Ninja 来提高构建效率。

使用场景

  • 当你使用 CMake 管理项目并且希望加快构建速度时,可以选择让 CMake 生成 Ninja 构建文件而不是传统的 Makefile。
  • 在需要频繁进行代码修改和测试的情况下,Ninja 能够显著减少增量构建的时间。
  • 对于大型项目或拥有大量源文件的项目,Ninja 提供了比传统 Make 更好的性能表现。

安装与使用

在大多数平台上,你可以轻松安装 Ninja:

  • Linux: 使用包管理器,例如 sudo apt-get install ninja-build
  • macOS: 可以通过 Homebrew 安装,运行 brew install ninja
  • Windows: 可以通过 Chocolatey (choco install ninja) 或者直接从 Ninja 的 GitHub 发布页面下载二进制文件。

一旦安装完毕,在使用 CMake 配置项目时,可以通过指定 -G Ninja 参数来选择 Ninja 作为生成的构建系统:
下面是一个使用 CMake + Ninja 构建的简单 Hello World C++ 程序示例

📁 项目结构

hello-world/
├── CMakeLists.txt
└── main.cpp

✅ 步骤一:编写 main.cpp

// main.cpp
#include <iostream>int main() {std::cout << "Hello, World from CMake and Ninja!" << std::endl;return 0;
}

✅ 步骤二:编写 CMakeLists.txt

# 设置CMake最低版本要求
cmake_minimum_required(VERSION 3.14)# 设置项目名称
project(HelloWorld)# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 添加可执行文件
add_executable(hello main.cpp)

✅ 步骤三:使用 CMake 配合 Ninja 构建项目

打开终端,进入项目目录,依次运行以下命令:

# 创建构建目录并进入
mkdir build && cd build# 使用 CMake 生成 Ninja 构建配置
cmake -G Ninja ..# 执行构建
ninja

✅ 运行程序

构建完成后,在 build 目录下会生成一个名为 hello(或 hello.exe 在 Windows)的可执行文件:

./hello

输出结果:

Hello, World from CMake and Ninja!

🧠 补充说明

  • -G Ninja:告诉 CMake 使用 Ninja 构建系统。
  • Ninja 是比 Make 更快的构建后端,适合大型项目。
  • 如果你使用 IDE(如 VS Code 或 CLion),也可以配置为使用 Ninja 后端。

能 CMake + make的项目,是否也可以CMake + ninja?

是的,大多数可以使用 make 构建的 CMake 项目也可以使用 ninja 构建,因为它们都只是 CMake 生成的不同构建后端。

✅ 简单回答:

能用 cmake + make 构建的项目,通常也能用 cmake + ninja 构建。

你只需要在配置阶段告诉 CMake 使用 Ninja 作为构建系统即可:

cmake -G "Ninja" ..

然后使用 ninja 命令进行构建:

ninja

🧠 详细解释

🔁 CMake 的作用

CMake 是一个“元构建系统”(meta build system),它不会直接编译代码,而是根据 CMakeLists.txt 文件生成适用于不同构建工具的配置文件。

  • 如果你使用:

    cmake ..
    

    默认会生成适用于 makeMakefile(在 Unix-like 系统上)。

  • 如果你使用:

    cmake -G "Ninja" ..
    

    它会生成 .ninja 配置文件供 ninja 使用。

🚀 为什么选择 Ninja?

相比传统的 makeNinja 更快、更高效,尤其适合大型项目,原因包括:

  • 更小、更高效的构建描述文件
  • 更好的并行支持
  • 更快的增量构建速度

🛠 示例对比

使用 make
mkdir build && cd build
cmake ..                # 生成 Makefile
make                    # 使用 make 构建
使用 ninja
mkdir build && cd build
cmake -G Ninja ..       # 生成 .ninja 文件
ninja                   # 使用 ninja 构建

⚠️ 注意事项

  1. 需要安装 Ninja

    • Linux: sudo apt install ninja-build
    • macOS: brew install ninja
    • Windows: 可通过 choco install ninja 或使用 Python pip: pip install ninja
  2. 确保有合适的编译器

    • gcc, clang, MSVC
  3. 有些 IDE 默认使用 Ninja

    • 比如 VS Code + CMake 插件、CLion 等默认就使用 Ninja 构建系统

✅ 总结

工具链是否兼容
cmake + make✅ 支持
cmake + ninja✅ 同样支持
转换难度🔧 极低

如果你有一个已有的 make 项目,想换成 ninja,只需重新配置一次即可:

rm -rf build && mkdir build && cd build
cmake -G Ninja ..
ninja
http://www.xdnf.cn/news/866395.html

相关文章:

  • CortexON:开源的多代理AI系统无缝自动化和简化日常任务
  • 【推荐算法】推荐系统核心算法深度解析:协同过滤 Collaborative Filtering
  • 07 APP 自动化- appium+pytest+allure框架封装
  • RabbitMQ 的异步化、解耦和流量削峰三大核心机制
  • ④Pybullet之Informed RRT*算法介绍及示例
  • 在本地查看服务器上的TensorBoard
  • Git安装与常用命令全攻略
  • Elasticsearch的搜索流程描述
  • 分类与逻辑回归 - 一个完整的guide
  • Git常用命令完全指南:从入门到精通
  • 正则表达式检测文件类型是否为视频或图片
  • 海信IP810N-海思MV320芯片-安卓9-2+16G-免拆优盘卡刷固件包
  • 【Android】RV折叠适配器
  • 基于大模型的结节性甲状腺肿智能诊疗系统技术方案
  • NLP学习路线图(二十三):长短期记忆网络(LSTM)
  • constexpr 是 C++11 引入的关键字
  • PocketFlow 快速入门指南
  • 阿里内推-6月新出HC
  • App 上线后还能加固吗?iOS 应用的动态安全补强方案实战分享(含 Ipa Guard 等工具组合)
  • 数学复习笔记 26
  • 雷卯针对易百纳G610Q-IPC-38E 模组防雷防静电方案
  • 2025年大模型平台落地实践研究报告|附75页PDF文件下载
  • MySQL 索引底层原理剖析:B+ 树结构、索引创建维护与性能优化策略全解读
  • x86 汇编逻辑运算全解析:从【位操作】到实际应用(AND,OR,NOT,XOR,TEST)
  • 缓存控制HTTP标头设置为“无缓存、无存储、必须重新验证”
  • Cursor 工具项目构建指南: Web Vue-Element UI 环境下的 Prompt Rules 约束(new Vue 方式)
  • 杰发科技AC7801——使用内部晶振
  • 极客时间-《搞定音频技术》-学习笔记
  • 大数据学习(128)-数据分析实例
  • Linux开发工具(apt,vim,gcc)