Ninja
Ninja 是构建后端/执行器,不是高级项目配置工具。它读取 build.ninja,根据里面的规则并行执行编译和链接命令。
日常 C/C++ 项目里,build.ninja 通常由 CMake 或 Meson 生成,不建议大型项目手写。
Ninja 在工具链里的位置
CMakeLists.txt
-> cmake -G Ninja -S . -B build
-> build/build.ninja
-> ninja -C build
-> 编译器和链接器
-> 可执行文件/库文件build 目录的作用
build 目录通常保存:
build.ninja:Ninja 要执行的构建图。CMakeCache.txt:CMake 配置缓存。CMakeFiles/:CMake 生成的内部文件。.o、.obj:中间目标文件。- 可执行文件、库文件、测试产物。
好处是源码目录保持干净,可以同时有多个构建目录:
cmake -S . -B build-debug -G Ninja -DCMAKE_BUILD_TYPE=Debug
cmake -S . -B build-release -G Ninja -DCMAKE_BUILD_TYPE=Release最小 build.ninja 示例
目录结构:
hello-ninja/
├── build.ninja
└── main.cppmain.cpp:
#include <iostream>
int main()
{
std::cout << "Hello Ninja" << std::endl;
return 0;
}build.ninja:
cxx = g++
cxxflags = -std=c++17 -Wall -Wextra
rule cxx
command = $cxx $cxxflags -c $in -o $out
description = CXX $out
rule link
command = $cxx $in -o $out
description = LINK $out
build main.o: cxx main.cpp
build hello: link main.o
default hello构建:
ninja
./helloWindows 下如果用 MinGW:
ninja
hello.exeCMake 生成 Ninja
CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(HelloNinja LANGUAGES CXX)
add_executable(hello main.cpp)
target_compile_features(hello PRIVATE cxx_std_17)命令:
cmake -S . -B build -G Ninja
cmake --build build
ninja -C buildcmake --build build 会自动调用对应后端;如果生成器是 Ninja,它内部就是调用 Ninja。
核心命令自查表
| 命令 | 作用 |
|---|---|
ninja | 在当前目录读取 build.ninja 并构建默认目标 |
ninja app | 构建指定目标 |
ninja -C build | 进入 build 目录构建 |
ninja -t targets | 查看可构建目标 |
ninja -t clean | 清理构建产物 |
ninja -j8 | 8 线程并行构建 |
ninja -v | 显示完整编译命令 |
常见错误
| 现象 | 原因 | 处理 |
|---|---|---|
loading 'build.ninja': No such file | 当前目录没有 build.ninja | 用 ninja -C build 或先运行 CMake |
| 改了 CMake 配置但 Ninja 没变化 | 没重新配置 | 执行 cmake -S . -B build -G Ninja |
| 找不到编译器 | 环境变量或工具链没配置 | 确认 g++、clang++ 或 cl 可执行 |
| 链接失败 | 依赖库没加入链接命令 | 回到 CMake/Meson 配置里修正依赖 |
注意事项
- Ninja 语法很低层,适合机器生成。
- 大多数项目应修改
CMakeLists.txt,而不是直接改生成出来的build.ninja。 - 删除
build目录后需要重新执行配置命令。