目录
1.引入Ninja的原因
2.Ninja 环境搭建(跨平台)
2.1.Linux系统安装
2.2.macOS 系统
2.3.Windows 系统
2.4.源码编译安装(通用方案)
3.Ninja 与构建系统配合:以 CMake 为例
4.加速构建的关键技巧
5.Ninja 与 Make 构建速度对比
6.项目构建过程中遇到的问题
7.总结
相关链接
1.引入Ninja的原因
Ninja 是一款由 Google 开发的轻量、高速的构建系统,专注于 “快速执行构建”,尤其擅长处理大型项目的频繁增量构建。相比传统的 Make,Ninja 启动速度更快、并行编译效率更高,是频繁迭代开发场景(如 C++/Rust 项目)的理想选择。
Ninja 加速构建的核心原因:
1.极简设计:Ninja 的构建文件(.ninja
)语法简单,仅包含必要的依赖和命令,解析速度远快于 Makefile(避免 Make 的复杂语法和冗余处理)。
2.高效并行:默认充分利用多核 CPU,并行任务调度更智能(比 Make 更精准地控制并行数,减少资源竞争)。
3.增量构建优化:对文件修改的检测和依赖跟踪更高效,仅重新编译受影响的文件,避免不必要的重建。
4.无冗余开销:启动时几乎无额外计算(如 Make 会重新解析整个 Makefile),适合频繁构建(如开发中 “改一行代码就重建” 的场景)。
2.Ninja 环境搭建(跨平台)
Ninja 支持 Windows、Linux、macOS,安装方式简单,优先推荐通过包管理器或官方二进制包安装。
2.1.Linux系统安装
通过包管理器安装(推荐):
Ubuntu/Debian:
sudo apt update && sudo apt install ninja-build
Fedora/RHEL:
sudo dnf install ninja-build
Arch Linux:
sudo pacman -S ninja
验证安装:
ninja --version # 输出版本号即成功(如 1.11.1)
2.2.macOS 系统
通过 Homebrew 安装(推荐):
brew install ninja
验证:
ninja --version
2.3.Windows 系统
Windows 需手动配置 PATH,推荐以下两种方式:
方式 1:包管理器安装(需先安装 Chocolatey 或 Scoop):
Chocolatey:
choco install ninja -y
Scoop:
scoop install ninja
方式 2:手动下载二进制:
- 从 Ninja 官网 下载最新 Windows 二进制包(如
ninja-win.zip
)。 - 解压得到
ninja.exe
,将其所在目录(如C:\tools\ninja
)添加到系统环境变量PATH
。 - 重启终端,执行
ninja --version
验证。
2.4.源码编译安装(通用方案)
若上述方法不适用,可从源码编译(需 Python 3 环境):
构造Ninja可使用CMake或python,需要先安装re2c:
1.安装re2c。下载地址:http://re2c.org/index.html
tar -xvzf re2c-1.0.3.tar.gz # 解压
cd re2c-1.0.3/ # 进入目录
autoreconf -i -W all # 生成configure(若无configure时用)
./configure # 配置编译选项
make # 编译
sudo make install # 安装(需管理员权限)
2.re2c安装成功之后开始Ninja安装:
# 克隆源码
git clone https://github.com/ninja-build/ninja.git
cd ninja# 编译(生成 ninja 二进制文件)
python3 configure.py --bootstrap# 安装(Linux/macOS 为例,Windows 直接使用生成的 ninja.exe)
sudo cp ninja /usr/local/bin/
3.Ninja 与构建系统配合:以 CMake 为例
Ninja 本身不直接处理项目配置(如依赖、编译选项),通常由 CMake、Meson 等工具生成 .ninja
构建文件,再通过 Ninja 执行构建。以下以最常用的 CMake 为例说明。
1.生成 Ninja 构建文件
在 CMake 项目中,通过 -G "Ninja"
指定生成 Ninja 格式的构建文件:
# 创建构建目录(推荐 out-of-source 构建,避免污染源码)
mkdir build && cd build# 生成 Ninja 构建文件(替代默认的 Makefile)
cmake -G "Ninja" .. # .. 指向源码根目录(含 CMakeLists.txt)
执行后,build
目录下会生成 build.ninja
(主构建文件)、rules.ninja
(编译规则)等,后续通过 Ninja 构建。
2.执行构建
生成构建文件后,直接用 ninja
命令启动构建:
# 构建默认目标(如 all 目标)
ninja# 构建指定目标(如生成可执行文件 myapp)
ninja myapp# 清理构建产物
ninja clean# 显示详细编译命令(调试用)
ninja -v
4.加速构建的关键技巧
Ninja 本身已足够高效,但结合以下技巧可进一步提升构建速度,尤其适合大型项目。
1.最大化并行编译
Ninja 默认根据 CPU 核心数自动并行执行任务(类似 make -j$(nproc)
),但可手动指定更优的并行数(避免过多任务导致内存瓶颈):
# 查看 CPU 核心数(Linux/macOS)
nproc # 输出如 8(8 核)# 指定 8 个并行任务(根据核心数调整,通常等于或略大于核心数)
ninja -j 8
注意:并行数并非越大越好,若项目编译需要大量内存(如链接大型二进制),过度并行可能导致内存不足,需根据实际硬件调整。
2.配合编译缓存(ccache/sccache)
编译缓存工具(如 ccache
或 sccache
)可缓存编译产物,重复编译相同代码时直接复用,大幅减少编译时间。需在 CMake 中配置编译器路径为缓存工具:
# 安装 ccache(Linux 为例)
sudo apt install ccache# 生成 Ninja 构建文件时,指定 C/C++ 编译器为 ccache 包装的 clang/gcc
cmake -G "Ninja" \-DCMAKE_C_COMPILER=ccache \-DCMAKE_CXX_COMPILER=ccache \-DCMAKE_C_COMPILER_LAUNCHER=ccache \-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \..
后续 ninja
构建时,ccache
会自动缓存 .o
目标文件,重复修改少量代码时,编译时间可减少 50% 以上。
3.优化增量构建
Ninja 对增量构建的优化是其核心优势之一,但需注意:
- 确保项目的
CMakeLists.txt
正确设置依赖(如target_link_libraries
、target_include_directories
),避免不必要的文件被标记为 “需要重建”。 - 避免在构建目录中手动修改文件,防止 Ninja 的依赖跟踪失效。
4.使用 ninja -t
调试构建问题
若构建异常(如重复编译、依赖错误),可通过 Ninja 的调试命令分析:
# 列出所有目标
ninja -t targets# 查看目标依赖链(如 myapp 依赖哪些文件)
ninja -t graph myapp | dot -Tpng -o myapp_deps.png # 需要安装 graphviz# 检查哪些文件会触发目标重建
ninja -t dependents myapp.cpp
5.结合 Clang 或 Mold 链接器
链接阶段(尤其大型项目)往往是构建瓶颈,可配合更快的链接器:
- Clang 链接器(lld):比 GNU ld 更快,CMake 中指定
CMAKE_EXE_LINKER_FLAGS=-fuse-ld=lld
。 - Mold 链接器:速度远超 lld,适合超大项目,配置
CMAKE_EXE_LINKER_FLAGS=-fuse-ld=mold
。
配置方式:
cmake -G "Ninja" \-DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \-DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld" \..
5.Ninja 与 Make 构建速度对比
以之前的Fast-DDS为例,在麒麟V10桌面虚拟机化境下,对比相同配置下的构建时间:
通信中间件 Fast DDS(一) :编译、安装和测试_fast dds 安装-CSDN博客
构建场景 | Make(命令make) | Ninja(命令ninja) | 加速比例 |
---|---|---|---|
全量构建(首次) | 9分25秒 | 3分44秒 | 61.4% |
增量构建(改 1 文件) | 未测试 | 未测试 | 未知 |
可见,Ninja 在构建中优势很明显,这对频繁调试的开发场景至关重要。
6.项目构建过程中遇到的问题
1.在windows命令行构建报错
解决方法:
在 Visual Studio 开发者命令提示符(而非普通 PowerShell)中运行 CMake,步骤:
1) 开始菜单找到 “Developer Command Prompt for Visual Studio 2022” 并打开;
2) 进入项目 build
目录,执行:
cmake -G "Ninja" ..
(原理:普通终端未加载 MSVC 编译器环境变量,开发提示符会自动配置 CL.exe
路径。)
2.检查架构一致性(32 位 vs 64 位)
你的编译日志显示当前使用的是 32 位编译器(Hostx86/x86/cl.exe
),而 vcpkg
安装的依赖(如 asio_x64-windows
)是 64 位版本,可能存在架构不匹配:
- 若
fastcdr
安装的是 64 位版本,而编译器是 32 位,会导致查找失败。 - 解决:使用 64 位 VS 开发者命令提示符(如 “x64 Native Tools Command Prompt for VS 2022”),并确保
fastcdr
是 64 位版本。
7.总结
Ninja 是提升项目构建效率的 “利器”,其核心价值在于快速启动、高效并行和精准增量构建。通过以下步骤可充分发挥其优势:
- 按系统需求安装 Ninja(包管理器或二进制包最便捷);
- 用 CMake 生成 Ninja 构建文件(
-G "Ninja"
); - 结合
-j
调整并行数、ccache
缓存编译产物、快速链接器(lld/mold)进一步加速; - 用
ninja -t
命令调试构建依赖问题。
对于需要频繁迭代的大型项目,Ninja 可显著减少构建等待时间,提升开发效率。
相关链接
- CMake 官网 CMake - Upgrade Your Software Build System
- CMake 官方文档:CMake Tutorial — CMake 4.1.0 Documentation
- CMake 源码:https://github.com/Kitware/CMake
- CMake 源码:https://gitlab.kitware.com/cmake/
- 中文版基础介绍: CMake 入门实战 | HaHack
- wiki: https://gitlab.kitware.com/cmake/community/-/wikis/Home
- Modern CMake 简体中文版: Introduction · Modern CMake