vcpkg: 一款免費開源的C++包管理器

目錄

1.簡介

2.安裝

3.常用命令

4.與項目集成

5.vcpkg的工作原理

5.1.包索引:ports 系統(定義庫的 “元信息”)

5.2.源碼獲取:從 “地址” 到 “本地緩存”

5.3.編譯構建:按 “triplet” 定制目標

5.4.安裝布局:按 “triplet” 隔離文件

5.5.項目集成:讓構建系統 “找到” 庫

6.常見問題

7.總結

官方資源矩陣


1.簡介

????????vcpkg?是微軟開發的?C++ 包管理工具,旨在簡化跨平臺 C++ 庫的獲取、編譯和集成過程。它解決了 C++ 開發中 “庫版本不一致、編譯配置復雜、跨平臺適配難” 等痛點,支持 Windows、Linux、macOS 等主流系統,可與 CMake、Visual Studio 等工具無縫集成。

? ? ? ? 為什么使用 vcpkg?

  • 在特選注冊表中有超過?2300 個開源庫可供選擇,這些庫會定期生成,用于驗證 ABI 兼容性
  • 使用自己的自定義庫包創建自定義庫注冊表
  • 適用于 Windows、macOS 和 Linux 的一致的跨平臺體驗
  • 使用任何生成和項目系統輕松將庫添加到項目
  • 從源生成依賴項或下載預生成的 ABI 驗證二進制文件,默認提供 70 多個配置,并可針對特定要求進行無限自定義
  • 通過獨特的版本控制設計,防止依賴項之間出現版本沖突和菱形依賴問題
  • 對于 MSBuild 和 CMake 用戶:自動與生成環境集成,打造無縫獲取依賴項的體驗
  • 受到學生、開源開發人員、業余愛好者和專業人士的信任,包括一些大型企業

????????核心功能

  1. 自動管理庫依賴:安裝庫時自動下載并編譯其依賴項(如安裝openssl時自動處理zlib等依賴)。
  2. 跨平臺一致性:同一套命令可在 Windows、Linux、macOS 上安裝相同版本的庫,保證開發環境一致。
  3. 靈活的目標配置:支持不同架構(x86/x64/arm)、編譯類型(Debug/Release)、鏈接方式(靜態 / 動態)。
  4. 與構建系統集成:無縫對接 CMake、MSBuild,無需手動設置庫路徑。

2.安裝

1.Windows 安裝

# 克隆倉庫(需Git)
git clone https://github.com/microsoft/vcpkg
cd vcpkg# 運行 bootstrap 腳本(生成vcpkg可執行文件)
.\bootstrap-vcpkg.bat# 驗證安裝
.\vcpkg --version

2.Linux/macOS 安裝

# 克隆倉庫
git clone https://github.com/microsoft/vcpkg
cd vcpkg# 運行bootstrap腳本
./bootstrap-vcpkg.sh# 驗證安裝
./vcpkg --version

安裝完成后,建議將vcpkg目錄添加到系統PATH,方便全局調用。

3.常用命令

1.基本操作

命令功能
vcpkg search <庫名>

搜索庫(如vcpkg search boost-asio),支持正則表達式

如:vcpkg search "boost.*asio"

vcpkg install <庫名>:<triplet>

安裝指定庫(triplet指定平臺,如x64-windows),如:

vcpkg install zlib:x64-windows-static

vcpkg remove <庫名>卸載庫
vcpkg list

列出已安裝的庫,如:

vcpkg list --x-tree

vcpkg update檢查可更新的庫
vcpkg upgrade

更新所有已安裝的庫,如:

vcpkg upgrade --no-dry-run

vcpkg export

導出二進制供分發,如:

vcpkg export boost --zip

2.關鍵概念:triplet

triplet是 vcpkg 用于指定目標平臺、架構、鏈接方式的標識,格式為<arch>-<os>-<link>,常見值:

  • x64-windows:Windows x64,動態鏈接(默認)
  • x64-windows-static:Windows x64,靜態鏈接
  • x64-linux:Linux x64
  • arm64-osx:macOS ARM64(M 系列芯片)

3.安裝示例

# 安裝Boost.Asio(Windows x64,動態鏈接)
vcpkg install boost-asio:x64-windows# 安裝OpenSSL(Linux x64,靜態鏈接)
vcpkg install openssl:x64-linux-static# 安裝多個庫(自動處理依賴)
vcpkg install fmt spdlog:x64-windows

4.與項目集成

1.CMake 項目(推薦)

CMakeLists.txt中通過CMAKE_TOOLCHAIN_FILE指定 vcpkg 的工具鏈:

# 假設vcpkg安裝在C:\vcpkg
set(CMAKE_TOOLCHAIN_FILE "C:/vcpkg/scripts/buildsystems/vcpkg.cmake")
project(MyProject)# 直接find_package使用已安裝的庫
find_package(Boost REQUIRED COMPONENTS asio)
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE Boost::asio)

編譯時無需手動指定庫路徑,CMake 會自動通過 vcpkg 找到依賴。

2.Visual Studio 項目

# 將vcpkg集成到所有VS項目(管理員權限)
vcpkg integrate install# 取消集成
vcpkg integrate remove

集成后,VS 會自動識別 vcpkg 安裝的庫,直接#include并鏈接即可。

3.清單模式(Manifest )模式(推薦用于項目依賴管理)

在項目根目錄創建vcpkg.json,聲明依賴:

// vcpkg.json
{"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json","name": "my-game-engine","version": "1.3.0","dependencies": ["entt",                            // 隱式最新版{ "name": "glfw3", "version>=": "3.3" },  // 版本約束{"name": "spdlog","features": ["fmt"]              // 啟用可選特性}],"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc" // Git提交鎖定
}

編譯時 vcpkg 會自動安裝vcpkg.json中聲明的依賴,確保團隊成員使用相同版本的庫。

5.vcpkg的工作原理

vcpkg?的核心目標是自動化 C++ 庫的獲取、編譯、安裝和項目集成,其工作原理可通過?“包索引→源碼獲取→編譯構建→安裝布局→項目集成”?五個核心環節解析:

5.1.包索引:ports 系統(定義庫的 “元信息”)

vcpkg 通過?ports?目錄?管理所有支持的庫,每個庫對應一個獨立的子目錄(如?ports/boost-asio),內含描述庫信息的關鍵文件:

  • portfile.cmake:核心腳本,定義庫的下載地址(Git 倉庫、壓縮包 URL)、校驗信息(SHA512 哈希,確保源碼完整性)、編譯參數(CMake 選項、補丁文件)、依賴關系(如?boost-asio?依賴?boost-system)等。
  • vcpkg.json:庫的元數據(名稱、版本、許可證等),用于版本管理和依賴解析。
  • 補丁文件(可選):如?0001-fix-compile-error.patch,解決特定平臺的編譯問題(如 Windows/Linux 兼容性)。

當用戶執行?vcpkg install <庫名>?時,vcpkg 首先通過?ports?目錄定位該庫的?portfile.cmake,獲取構建所需的全部信息。

5.2.源碼獲取:從 “地址” 到 “本地緩存”

根據?portfile.cmake?中的配置,vcpkg 執行以下步驟獲取源碼:

1) 解析下載地址:支持 Git 倉庫(帶分支 / 標簽)、HTTP/HTTPS 壓縮包(.tar.gz/.zip)等。

2) 校驗完整性:下載后通過?portfile.cmake?中定義的 SHA512 哈希值校驗源碼,防止篡改或損壞。

3) 緩存源碼:將源碼解壓 / 克隆到?vcpkg/downloads?目錄,后續安裝同一版本時直接復用,避免重復下載。

5.3.編譯構建:按 “triplet” 定制目標

vcpkg 的核心能力之一是跨平臺編譯,通過?triplet(目標標識)?控制編譯參數,確保庫適配指定平臺。

1)?triplet 的作用

triplet?是一個字符串(如?x64-windowsarm64-linux-static),編碼了三個關鍵信息:

  • 架構x64(64 位)、x86(32 位)、arm64(ARM 64 位)等;
  • 操作系統windowslinuxosx(macOS)等;
  • 鏈接方式:默認動態鏈接(如?x64-windows),-static?后綴表示靜態鏈接(如?x64-linux-static)。

vcpkg 會根據 triplet 加載對應的配置文件(如?triplets/x64-windows.cmake),設置編譯工具鏈(編譯器路徑、標準庫)、宏定義(如?_WIN32__linux__)等。

2)?依賴遞歸編譯

若庫 A 依賴庫 B,vcpkg 會:

  1. 先檢查庫 B 是否已安裝(按當前 triplet);
  2. 若未安裝,自動觸發庫 B 的編譯流程(重復 “源碼獲取→編譯” 步驟);
  3. 待庫 B 安裝完成后,再編譯庫 A,并在編譯時自動鏈接庫 B 的頭文件和庫文件。

3)?構建系統適配

vcpkg 支持多種構建系統(CMake、MSBuild、Make、Autotools 等),通過?portfile.cmake?中的腳本適配:

  • 對 CMake 庫:調用?cmake?并傳入 triplet 對應的工具鏈;
  • 對 Make 庫:調用?make?并設置?CC/CXX?編譯器路徑;
  • 對 Visual Studio 項目:調用?msbuild?并指定平臺(如?x64)和配置(Debug/Release)。

5.4.安裝布局:按 “triplet” 隔離文件

編譯完成后,vcpkg 將庫文件安裝到?vcpkg/installed?目錄,按 triplet 分類存儲,確保不同平臺 / 配置的庫不沖突。典型目錄結構如下:

installed/
├─ x64-windows/           # triplet 為 x64-windows 的庫
│  ├─ include/            # 頭文件(如 boost/asio.hpp)
│  ├─ lib/                # 動態庫(.dll.a 或 .lib)
│  ├─ bin/                # 可執行文件(如工具類庫)
│  └─ share/              # 配置文件(如 CMake 模塊)
└─ x64-linux-static/      # triplet 為 x64-linux-static 的庫├─ include/└─ lib/                # 靜態庫(.a)

這種布局讓項目可以根據自身目標平臺,精準引用對應 triplet 的庫文件。

5.5.項目集成:讓構建系統 “找到” 庫

第4章節,與項目集成已經講了,就不這里贅述了。

6.常見問題

1)安裝失敗:檢查網絡(需訪問 GitHub,設置代理:set HTTP_PROXY=http://127..0.0.1:1080)、依賴工具(如 CMake、編譯器)是否安裝。

2)庫版本沖突:通過vcpkg install <庫名>=<版本>指定版本(如vcpkg install boost-asio=1.78.0)。

3)靜態 / 動態鏈接切換:通過triplet區分(如x64-windows-static強制靜態鏈接)。如:安裝對應VS組件:vcpkg env --triplet=x64-windows

7.總結

優勢總結:

  • 簡化流程:一鍵安裝復雜庫(如 Boost、OpenCV),無需手動編譯。
  • 跨平臺統一:一套命令適配多系統,避免 “在 Windows 能編,Linux 編不過” 的問題。
  • 版本可控:支持指定庫版本,配合 Manifest 模式可固化項目依賴。

vcpkg 已成為 C++ 開發的主流包管理工具,尤其適合需要跨平臺開發或依賴眾多第三方庫的項目(如 FastDDS、ROS 2 等)。

官方資源矩陣

  • 📚?文檔中心:Page Redirection
  • 🚀?GitHub 倉庫:microsoft/vcpkg
  • 📊?包搜索引擎:vcpkg.io/packages
  • 💬?社區支持:GitHub Discussions

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

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

相關文章

WinCC通過無線Modbus TCP監控S7-1200/200SMT PLC實例詳解

工業自動化系統中&#xff0c;車間內通常部署多臺PLC設備并需通過中央監控平臺實現集中管控。考慮到工業現場設備間距普遍在數十至數百米范圍&#xff0c;傳統有線以太網雖能保障傳輸速率&#xff0c;但其施工需面臨電纜溝開挖或復雜布線工程&#xff0c;既增加線材采購、人力投…

【AI智能編程】Trae-IDE工具學習

什么是Trae&#xff1f; Trae與 AI 深度集成&#xff0c;提供智能問答、代碼自動補全以及基于 Agent 的 AI 自動編程能力。使用 Trae 開發項目時&#xff0c;你可以與 AI 靈活協作&#xff0c;提升開發效率。提供傳統的 IDE 功能&#xff0c;包括代碼編寫、項目管理、插件管理…

智能駕駛再提速!批量蘇州金龍L4級自動駕駛巴士交付杭州臨平區

近日&#xff0c;由蘇州金龍海格客車研發的“清源”L4級自動駕駛巴士現身杭州市臨平區并投入測試。這是臨平區引進的首批L4級自動駕駛巴士&#xff0c;標志著臨平區智能交通建設邁入新階段。此次投入測試的“清源”小巴采用一級踏步設計&#xff0c;車身延續了海格蔚藍巴士的經…

Spring_事務

在mysql階段的文章中&#xff0c;已經介紹過事務了。本篇文章是對mysql事務的總結和對使用Spring框架來實現事務操作的講解。事務回顧什么是事務事務時一組操作的集合&#xff0c;是一個不可分割的操作。事務會把所有操作作為一個整體&#xff0c;一起向數據庫提交或者撤銷操作…

事務管理介紹

為什么要用事務管理在我們同時操作兩個或更多個數據庫時&#xff0c;可能因為網絡等各方面原因導致中間出現異常。造成像對第一個數據庫的操作成功了&#xff0c;但是對第二個數據庫的操作沒有成功。這樣數據的完整性就被破壞了。事務&#xff1a;是一組操作的集合&#xff0c;…

Android 之 ViewBinding 實現更安全、高效的視圖綁定

??一、配置說明????作用位置??需在模塊級 build.gradle或 build.gradle.kts文件的 android {}塊內添加&#xff1a;android {buildFeatures {viewBinding true // Kotlin DSL 語法} }android {buildFeatures {viewBinding true // Groovy 語法} }??生成規則??為每…

全球首款Java專用AI開發助手實測:一句話生成完整工程代碼——飛算 JavaAI

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f;&#x1f30d; 立志在堅不欲說&#xff0c;成功在久不在速&#x1f30d;&#x1f680; 歡迎關注&#xff1a;&#x1f44d;點贊??留言收藏&#x1f680;&#x1f340;歡迎使用&#xff1a;小智初學計算機…

Shader開發(七)創建第一個Shader項目

在前面的章節中&#xff0c;我們已經了解了Shader的基本概念和渲染管線的工作原理。現在&#xff0c;是時候動手實踐了&#xff01;本章將帶您一步步創建第一個Shader項目&#xff0c;開啟真正的Shader開發之旅。 為什么選擇openFrameworks&#xff1f; 與其他文章不同&#x…

IAR軟件中測量函數執行時間

通常在調試代碼中需要直到某個函數或者某段代碼的實際執行時間&#xff0c;在IAR中可以直接借助軟件提供的工具來計算代碼執行時間。 第一種方法 進入仿真調試界面&#xff0c;在需要測量的代碼前面打斷點。工具欄中選擇 ST-LINK — Data Log Summary在 Data Log Summary 窗口中…

Java 字節碼文件(.class)的組成詳解

文章目錄基礎信息常量池字段方法屬性字節碼文件內容說明案例文件基本信息類的基本信息常量池字段信息構造方法實例方法主方法源文件信息字節碼文件由五部分組成&#xff0c;分別是基礎信息、常量池、字段、方法、屬性。案例&#xff1a; public class Main implements Interfa…

C++之vector類的代碼及其邏輯詳解 (下)

1. insert()這個就是在指定位置插入一個元素&#xff0c;首先計算要插入的這個位置和開頭之間的距離&#xff0c;接著判斷那個_finish 有沒有碰到_endofstorage 或者_endofstorage 是不是為0&#xff0c;如果滿足條件&#xff0c;那就進行擴容&#xff0c;然后接著重新計算距離…

【自動化測試】Python Selenium 自動化測試元素定位專業教程

1. 引言&#xff1a;元素定位在 Selenium 中的核心地位 元素定位是 Selenium 自動化測試的基礎&#xff0c;所有用戶交互操作&#xff08;如點擊、輸入、選擇&#xff09;都依賴于準確識別頁面元素。Selenium WebDriver 提供了多種定位策略&#xff0c;從簡單的 ID 定位到復雜…

通用代碼自用

多文件上傳public int save(Role role, RequestParam("nfile") MultipartFile nfile, HttpServletRequest request) {System.out.println(nfile.getOriginalFilename());String path request.getSession().getServletContext().getRealPath("/upload");Fi…

生成式AI如何顛覆我們的工作和生活

原問題&#xff1a; ?你覺得生成式AI未來會如何改變普通人的工作和生活&#xff1f;? 做過一個對比國外和國內工業化產品制造的簡單調研&#xff0c;類似一款定制化的臺燈或者語音音響&#xff0c;從零到原型實物&#xff0c; 美國至少需要20萬美刀&#xff0c;國內成本大概…

K8S、Docker安全漏洞靶場

1 介紹 一個脆弱基礎設施自動化構建框架,主要用于快速、自動化搭建從簡單到復雜的脆弱云原生靶機環境。 1.1 項目的緣起 在研究漏洞時,我們經常會發現“環境搭建”這一步驟本身就會占用大量的時間,與之相比,真正測試PoC、ExP的時間可能非常短。由于許多官方鏡像在國內的…

使用Nginx部署前后端分離項目

使用Nginx部署前后端分離項目&#xff1a;用戶中心系統實踐指南 部署前的關鍵準備 在正式部署前&#xff0c;務必確保前后端在生產環境能正常運行&#xff1a; 前端&#xff1a;測試所有API請求路徑和生產環境配置后端&#xff1a;驗證數據庫連接、環境變量和外部服務集成完整流…

當前就業形勢下,軟件測試工程師職業發展與自我提升的必要性

軟件測試行業正處于深刻變革期&#xff0c;2025年的市場已超越400億美元規模&#xff0c;預計2027年將增長7% 。在這個技術驅動、效率至上的時代&#xff0c;測試工程師若想保持競爭力&#xff0c;必須主動擁抱變革&#xff0c;系統性提升技能。通過深入分析行業現狀與人才需求…

java 之 繼承

一、繼承 1.1 、什么是繼承&#xff1f; 繼承就是把所有的類的公共部分&#xff08;相同的成員&#xff09;提取出來&#xff0c;放到一個類中繼承需要使用 extends 關鍵字 public class Animal{ public String name&#xff1b; } public class Dog extends Animal{}Dog 是 An…

強化應急通信生命線:遨游三防平板、衛星電話破局極端災害救援

暴雨傾盆&#xff0c;山洪咆哮&#xff0c;城市陷入內澇。今年進入汛期以來&#xff0c;我國廣東、福建、河南、陜西、京津冀等地相繼遭遇暴雨、洪澇、山洪等災害&#xff0c;道路損毀、基站斷網、電力中斷等次生問題為應急響應帶來嚴峻挑戰。如何保障極端場景下的通信暢通&…

【Linux系統】進程間通信:命名管道

1. 匿名管道的限制匿名管道存在以下核心限制&#xff1a;僅限親緣關系進程&#xff1a;只能用于父子進程等有血緣關系的進程間通信&#xff08;如通過 fork() 創建的子進程&#xff09;。單向通信&#xff1a;數據只能單向流動&#xff08;一端寫&#xff0c;另一端讀&#xff…