目錄
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