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.cpp

main.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
./hello

Windows 下如果用 MinGW:

ninja
hello.exe

CMake 生成 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 build

cmake --build build 会自动调用对应后端;如果生成器是 Ninja,它内部就是调用 Ninja。

核心命令自查表

命令作用
ninja在当前目录读取 build.ninja 并构建默认目标
ninja app构建指定目标
ninja -C build进入 build 目录构建
ninja -t targets查看可构建目标
ninja -t clean清理构建产物
ninja -j88 线程并行构建
ninja -v显示完整编译命令

常见错误

现象原因处理
loading 'build.ninja': No such file当前目录没有 build.ninjaninja -C build 或先运行 CMake
改了 CMake 配置但 Ninja 没变化没重新配置执行 cmake -S . -B build -G Ninja
找不到编译器环境变量或工具链没配置确认 g++clang++cl 可执行
链接失败依赖库没加入链接命令回到 CMake/Meson 配置里修正依赖

注意事项

  • Ninja 语法很低层,适合机器生成。
  • 大多数项目应修改 CMakeLists.txt,而不是直接改生成出来的 build.ninja
  • 删除 build 目录后需要重新执行配置命令。