CentOS 7.9 + GCC9 離線安裝 IWYU(Include What You Use)

本教程適用于 離線環境下在 CentOS 7.9 系統中使用 GCC 9 離線安裝 IWYU 的完整步驟,涵蓋 Clang 11.1.0 編譯、IWYU 構建以及頭文件自動優化流程。


📥 一、準備安裝包

請提前下載以下源碼包(可通過在線機器提前下載,再傳輸到離線環境):

  • LLVM 源碼:

    https://github.com/llvm/llvm-project/releases/download/llvmorg-11.1.0/llvm-11.1.0.src.tar.xz
    
  • Clang 源碼:

    https://github.com/llvm/llvm-project/releases/download/llvmorg-11.1.0/clang-11.1.0.src.tar.xz
    
  • IWYU 源碼:

    git clone -b clang_11 https://github.com/include-what-you-use/include-what-you-use.git
    

🧱 二、編譯 Clang 11.1.0

# 解壓源碼
tar xf llvm-11.1.0.src.tar.xz
tar xf clang-11.1.0.src.tar.xz# 重命名 clang 并移動到 LLVM 源碼目錄下
mv clang-11.1.0.src llvm-11.1.0.src/tools/clang# 創建構建目錄并進入
mkdir llvm-build && cd llvm-build# 生成 Makefile
cmake -G "Unix Makefiles" \-DCMAKE_BUILD_TYPE=Release \-DLLVM_ENABLE_PROJECTS=clang \-DCMAKE_C_COMPILER=gcc \-DCMAKE_CXX_COMPILER=g++ \-DCMAKE_INSTALL_PREFIX=/opt/iwyu \../llvm-11.1.0.src# 編譯并安裝
make -j12
make install

🧩 三、編譯 IWYU

cd /path/to/include-what-you-use
mkdir build && cd buildcmake \-DCMAKE_PREFIX_PATH=/opt/iwyu \-DCMAKE_BUILD_TYPE=Release \-DCMAKE_INSTALL_PREFIX=/opt/iwyu \..
make -j12
make install

?? 四、在 CMake 項目中啟用 IWYU

在你的 CMakeLists.txt 中添加如下配置:

set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE /opt/iwyu/bin/include-what-you-use)# 靜態庫需要額外添加
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

📊 五、執行頭文件分析

python3 /path/to/include-what-you-use/iwyu_tool.py -p ./build > iwyu.out

參數說明:

  • -p ./build:指定包含 compile_commands.json 的目錄(通常是構建目錄)

  • > iwyu.out:將分析結果輸出到文件中,便于后續處理


🔧 六、自動優化頭文件

使用 IWYU 提供的 fix_includes.py 自動修復頭文件:

python3 /path/to/include-what-you-use/fix_includes.py < iwyu.out

腳本功能:

  • ? 刪除無用的 #include

  • ? 添加遺漏的 #include

  • ? 替換為更合適的頭文件(如將 "my_string.h" 替換為 <string>


? 七、安裝完成后結構檢查

最終 /opt/iwyu 應包含:

/opt/iwyu/
├── bin/
│   └── include-what-you-use
├── include/
├── lib/
└── ...

如有需要,可將 /opt/iwyu/bin 添加到環境變量中,便于全局使用:

export PATH=/opt/iwyu/bin:$PATH

如需繼續進行 IWYU 的靜態分析優化工作,也可以配合 Bear 工具生成 compile_commands.json,提高分析準確性。


如果你需要支持自動生成頭文件優化建議和分析報告,也可集成到 CI 腳本中,提升整個項目代碼質量和可維護性。

需要幫助集成腳本或遇到特定錯誤,也歡迎繼續提問。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90737.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90737.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90737.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Dapr Sidecar的微服務通信框架設計與性能優化實踐

基于Dapr Sidecar的微服務通信框架設計與性能優化實踐 一、技術背景與應用場景 隨著微服務架構的廣泛應用&#xff0c;分布式系統中服務間通信、可觀察性、可靠性等問題日益凸顯。Dapr&#xff08;Distributed Application Runtime&#xff09;作為一個開源的微服務運行時&…

Claude Code 超詳細完整指南(2025最新版)

&#x1f680; 終端AI編程助手 | 高頻使用點 生態工具 完整命令參考 最新MCP配置 &#x1f4cb; 目錄 &#x1f3af; 快速開始&#xff08;5分鐘上手&#xff09;&#x1f4e6; 詳細安裝指南 系統要求Windows安裝&#xff08;WSL方案&#xff09;macOS安裝Linux安裝安裝驗…

【lucene】SegmentReader初始化過程概述

readers[i] new SegmentReader(sis.info(i), sis.getIndexCreatedVersionMajor(), IOContext.READ); 這個方法已經把所有的文件都讀完了么&#xff1f;沒有“讀完”&#xff0c;但已經**全部“打開”**了。| 動作 | 是否發生 | |---|---| | **打開文件句柄 / mmap** | ? 立即完…

通俗理解主機的BIOS和UEFI啟動方式

“對于 22.04 版本&#xff0c;這些操作說明應適用于通過 BIOS 或 UEFI 兩種方式創建和運行啟動盤。”我們來詳細解釋一下這句話的含義&#xff0c;這句話的核心意思是&#xff1a;你按照這個教程制作出來的 Ubuntu U 盤&#xff0c;將擁有極佳的兼容性&#xff0c;無論是在老電…

Canal 1.1.7的安裝

數據庫操作的準備 1、開啟 Binlog 寫入功能&#xff0c;配置 binlog-format 為 ROW 模式&#xff0c;my.cnf 中配置如下: vi /etc/my.cnf [mysqld] log-binmysql-bin # 開啟 binlog binlog-formatROW # 選擇 ROW 模式 server_id1 # 配置 MySQL replaction 需要定義&#xff0c;…

python---類型轉換

文章目錄1. 基本類型轉換函數int() - 轉換為整數float() - 轉換為浮點數str() - 轉換為字符串bool() - 轉換為布爾值2. 其他類型轉換list() - 轉換為列表tuple() - 轉換為元組set() - 轉換為集合&#xff08;去重&#xff09;dict() - 轉換為字典3. 注意事項1. 兼容性&#xff…

JVM terminated. Exit code=1

出現JVM terminated. Exit code1錯誤通常是因為 Eclipse 所需的 Java 版本與系統中配置的 Java 版本不匹配。從錯誤信息中可以看到關鍵線索&#xff1a;-Dosgi.requiredJavaVersion21&#xff0c;表示此 Eclipse 版本需要 Java 21 或更高版本&#xff0c;但系統當前使用的是 Ja…

20250727-1-Kubernetes 網絡-Ingress介紹,部署Ingres_筆記

一、NodePort存在的不足 ?1. 四層負載均衡 ?? 實現技術: 基于iptables和ipvs實現 OSI層級: 位于傳輸層(第四層) 轉發依據: 基于IP地址和端口進行轉發 特點: 只能看到IP和端口信息 無法識別應用層協議內容 配置簡單但功能有限 2. 七層負載均衡 ?1)七層負載均衡的概念 ?…

Javaweb————HTTP的九種請求方法介紹

??????一.HTTP1.0定義的三種請求方式介紹 &#x1f3cd;?&#x1f3cd;?&#x1f3cd;?&#xff08;1&#xff09;GET請求 作用&#xff1a;向服務器獲取資源&#xff0c;比如常見的查詢請求 應用場景&#xff1a;絕大多數場景&#xff0c;比如我們訪問商城首頁查看圖…

C++day06(練習題)

循序漸進-基礎訓練 格式化輸入輸出 【描述】格式化輸入輸出練習輸入三個整數和一個浮點數&#xff0c;浮點數需要保留的不同小數點后面的數字。 【輸入描述】三個正整數以及以一個浮點數 【輸出描述】三個整數以及保留不同位數的浮點數 【樣例輸入】 1 2 3 9.12345678 【樣例輸…

基于大模型的預訓練、量化、微調等完整流程解析

隨著大語言模型&#xff08;LLM&#xff09;的飛速發展&#xff0c;模型的訓練、部署與優化成為了AI工程領域的重要課題。本文將從 預訓練、量化、微調 等關鍵步驟出發&#xff0c;詳細介紹大模型的完整技術流程及相關實踐。1. 預訓練&#xff08;Pre-training&#xff09; 1.1…

AI入門學習-模型評估示例講解

from sklearn.metrics import classification_report, confusion_matrix from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification# 生成示例分類數據 # n_samples: 樣本…

Python編程:初入Python魔法世界

一、常量表達式在編程中&#xff0c;常量指的是在程序執行期間其值不會改變的數據項。雖然 Python 并沒有專門的語法來定義常量&#xff08;不像某些其他語言如 Java 中有 final 關鍵字&#xff09;&#xff0c;但在實踐中&#xff0c;我們通常通過約定俗成的方式來表示一個變量…

Android WorkManager 詳解:高效管理后臺任務

引言在現代移動應用開發中&#xff0c;后臺任務處理是一個至關重要的功能。從同步數據到定期備份&#xff0c;從發送通知到處理耗時操作&#xff0c;后臺任務無處不在。然而&#xff0c;Android系統對后臺任務的限制越來越嚴格&#xff0c;開發者需要找到既高效又符合系統規范的…

MCU(微控制器)中的高電平與低電平?

MCU&#xff08;微控制器&#xff09;中的高電平與低電平&#xff1f; 在數字電路和MCU&#xff08;微控制器&#xff09;中&#xff0c;**高電平&#xff08;High Level&#xff09;和低電平&#xff08;Low Level&#xff09;**是兩種基本的邏輯狀態&#xff0c;用于表示二進…

前端項目下載發票pdf文件要求改文件名筆記

1、a鏈接&#xff08;修改失敗&#xff0c;存在跨域&#xff09;<el-table-columnalignrightlabel"下載地址"width"200"><template slot-scope"{row}"><a :href"row.dataUrl" download"文件名">下載</…

Kotlin 數據容器 - List(List 概述、創建 List、List 核心特性、List 元素訪問、List 遍歷)

一、List 概述List 是一個不可變的有序集合&#xff0c;一旦創建就不能修改其內容&#xff0c;即不能添加、刪除、更改元素List 提供了豐富的操作函數來處理數據二、創建 List 1、基礎創建 通過 listOf 函數創建&#xff08;推薦&#xff09; // 創建一個 List&#xff0c;包含…

HarmonyOS NEXT 系列之規范開發三方共享包

規范開發三方共享包〇、前言一、了解評分規則二、規范開發共享包1、規范開源協議名稱寫法2、將 oh-package.json5 文件補充完整3、補充 example 目錄4、基本的 README 和 CHANGELOG三、ohpm 包的源碼隔離特性〇、前言 對于開發者來說&#xff0c;對外發布代碼制品&#xff0c;…

[電網備考]計算機組成與原理

計算機系統概述 計算機發展歷程 從數據表示: 計算機可以分為數字計算機與模擬計算機 1946 第一臺電子數字計算機 ENIAC 在賓夕法尼亞大學誕生,標志進入電子計算機時代時間計算機發展階段1946-1958電子管計算機時代1958-1964晶體管計算機時代1964-1971集成電路計算機時代1971-至…

8.c語言指針

內存管理C語言中&#xff0c;棧內存&#xff08;局部變量&#xff09;自動分配/釋放&#xff0c;靜態區&#xff08;全局、靜態變量&#xff09;編譯時分配&#xff1b;堆內存需手動分配/釋放&#xff0c;核心函數有3個&#xff1a;malloc函數原型&#xff1a;void* malloc(siz…