当前位置: 首页 > web >正文

[vcpkg] Windows入门使用介绍

前言

笔者也是使用vcpkg的入门选手,有一些基本的使用经验,鉴于网络资源较少,特此分享一些使用经验,希望能帮助想使用vcpkg的同学快速入门。
当然最详细的用法还是要看官网教程,但是官网有些概念描述的比较模糊,而且没有一个简单易用的入门教程,导致笔者前期踩坑非常多。

简介

官方介绍:Vcpkg 是由 Microsoft 和 C++ 社区维护的免费开源 C/C++ 包管理器,可在 Windows、macOS 和 Linux 上运行。 它是核心的 C++ 工具,使用 C++ 和 CMake 脚本编写。 它旨在解决管理 C/C++ 库的独特难题

使用vcpkg的优势如下:

  • 版本控制更灵活:apt 中的库版本通常由 Ubuntu 发行版维护,更新较慢,而 vcpkg 可以让你灵活选择各种版本的库。
  • 针对开发场景优化:vcpkg 专注于开发需求,可以方便地获取库的开发文件(头文件、静态库等),而 apt 有时需要单独安装 - dev 包。
  • 跨平台一致性:如果你的项目需要在多个平台(如 Windows 和 Ubuntu)上编译,vcpkg 可以提供一致的依赖管理体验,避免因不同平台包管理差异带来的问题。
  • 支持更多第三方库:有些 C/C++ 库可能没有被收录到 Ubuntu 的官方软件源中,而 vcpkg 收录了大量流行的第三方库。
  • 隔离性:vcpkg 安装的库可以独立于系统库,避免对系统环境造成干扰,也方便多个项目使用不同版本的库。

总之vcpkg是一个非常便捷的针对C/C++的包管理器,笔者主要用于windows下的环境配置,从个人使用经验来说,windows下安装一个开源库,一般都要手动管理头文件和库文件,甚至部分开源库需要自己手动编译,还要手动安装依赖,最后还要配置VS属性表,十分麻烦。
使用vcpkg工具就省去了这些烦恼,他可以自动处理依赖编译一个适合当前系统的版本,可以直接与VS集成,而且基本不需要考虑包之间的依赖冲突问题。
笔者vcpkg的学习尚浅,有什么不合理的地方,或者错误的使用方法,欢迎大家在评论区提出,笔者一定会积极汲取经验。

vcpkg的安装

注意:本文以libigl库为例

  1. 下载源码
    可以直接下载zip也可以git clone,推荐使用git,后续更新vcpkg会更方便git pull即可
  2. 运行.\bootstrap-vcpkg.bat,就会在当前目录生成vcpkg.exe
  3. 建议将vcpkg.exe的路径添加到环境变量,这样就可以随时使用vcpkg了,不用切回vcpkg的安装路径

使用方式

vcpkg的包管理方式主要有两种:经典模式,清单模式

经典模式

官方
经典模式使用非常简单

安装库

安装包
vcpkg install libigl:x64-windows
vcpkg install libigl[cgal,embree]:x64-windows
libigl是库名
[cgal,embree]是相关依赖
x64-windows 指定平台
这种方式默认安装的是当前版本vcpkg中维护的库的最新状态,也就是说默认安装最新版本的库,但是不一定是库的最新版本,而是vcpkg的管理下对应库的最新版本
比如libigl可能官方更新了2.6.0,但是vcpkg还没有适配,那么vcpkg安装的就是2.5.0

查看一个库的依赖
vcpkg search libigl
这个命令本身并不是查看依赖的命令,但是可以搜索相关库,会列举出所有带有依赖的库的版本

查看可用平台
vcpkg help triplet
查看已安装包
vcpkg list

安装指定版本库

前面介绍了vcpkg直接安装,默认安装库的最新版本,那么如何安装指定版本呢?

比如我要安装一个libigl2.5.0的版本,但是最新vcpkg对应的是2.6.0版本
那么我可以查看vcpkg根目录下versions下对应库的起始字母文件夹,比如我要找libigl那就看l-文件夹,找到libigl.json文件,查看这个文件的提交记录,可以在本地用git查看也可以再官方库查看,这里为了直观一点在官方库查看
在这里插入图片描述
打开这个文件
在这里插入图片描述
点击右上角history
在这里插入图片描述
可以看到这个更新记录,在右侧可以复制完整的commit id
在这里插入图片描述
但是这里不建议直接用刚更新到2.5.0的这个版本
而是用更新到2.6.0之前的最后一个版本,刚刚更新的库可能会有很多bug,到这里基本bug会少很多

拿到这个commit id之后,回到自己的库里,git checkout <commit id>然后再安装想要的库,就是对应的版本了,比如我这边就会安装一个libigl的2.5.0的版本
vcpkg install libigl:x64-windows(不推荐使用该方法,但是记住这里的commit id 查询方法,后面会用到)

集成库

vcpkg integrate install这里是一个全局的集成,也就是说你可以在任何一个VS项目里访问vcpkg安装的所有库
vcpkg integrate remove 移除集成

删除库

vcpkg remove
官方的命令是
vcpkg remove --outdated 移除与可用端口版本不匹配的所有包
也就是说会删除和当前vcpkg版本不匹配的所有包,比如你更新了vcpkg,那么本次更新中被更新过的包会被删除

vcpkg remove libigl --recurse 允许移除命令行中未指定的包
个人理解就是会同时删除libigl依赖同时未被其他包依赖的包

但是吧,有时候vcpkg list没有了,但是在本地可能有些库的相关配置还保留着,也就是说删除是不彻底的,好像是官方为了某些方面的效率更高,如果不影响使用就可以不考虑删除文件
如果影响使用可能要删除部分文件夹才行,这里的原理笔者也没有搞清楚(能用就行)
可以参考vcpkg如何彻底删除已安装的库文件?
如果实在不行就直接把整个vcpkg根目录删除,重新clone仓库

清单模式

安装库

清单使用,在当前目录创建一个vcpkg.json文件填入指定格式的内容

{"dependencies": ["cxxopts","fmt","range-v3"]
}

在当前目录下执行vcpkg install
即可安装指定库的最新版本,默认安装最新版本

{"dependencies": [{ "name": "llvm", "features": ["target-arm"] }]
}

带有依赖项的库的安装清单,默认安装最新版本

安装指定版本库

这里必须提到一个非常重要的概念基线(baseline),个人理解这个基线的值等于vcpkg库中master分支的完整提交commit id,值上是相同的,但是概念不同(这里是笔者个人理解)

这里的清单这么写

{"dependencies": [{"name":"pcl","features":["examples","opengl","visualization"]}],"builtin-baseline": "10b7a178346f3f0abef60cecd5130e295afd8da4"
}

安装指定基线下最新的版本,这里的"builtin-baseline"值就是前面提到的对应的commit id

这里版本约束官方有两种方法
还有一个"version>=":
比如

{"dependencies": [{"name": "fmt","version>=": "10.1.1"},"zlib"],"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

两种方式下,会取版本较高的版本,加入基线对应的版本是7.1.3,根据这个清单最终安装的版本将会是10.1.1
如果不指定基线,只指定version>= ,默认还是会安装最新版本(这里笔者并没有验证,而是凭借经验)
所以如果不是非常复杂的版本关系,建议就只指定一个基线,然后在一个基线上进行开发,这样依赖会比较容易管理(能用就行)

集成到单个项目而不是全局

待探索…
不过会用清单之后应该会简单一些,可以参考给出的参考文献

CMake集成

简单来说只要指定vcpkg工具链路径即可
cmakelists.txt指定

# 检查环境变量是否存在set(CMAKE_TOOLCHAIN_FILE "D/library/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "vcpkg toolchain file")  # 这里换成自己vcpkg路径下对应的vcpkg.cmake文件的路径即可project(project CXX)message(STATUS "使用的工具链路径: ${CMAKE_TOOLCHAIN_FILE}")
find_package(libigl)

也可以命令行指定
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE="D/library/vcpkg/scripts/buildsystems/vcpkg.cmake"
命令行会覆盖掉cmakelists.txt中的设置

常见问题

安装库报错的解决方案

一般来说会输出以下内容,指示日志的位置

    See logs for more information:E:\Gemini\Src\vb\gmp\build-x64-windows-dbg-out.logE:\Gemini\Src\vb\gmp\build-x64-windows-dbg-err.log

去看两个文件最后明显可能是错误的地方
比如我在这个err.log中最后几行,找到了这样的报错
./libtool: eval: line 10827: syntax error near unexpected token |
然后把这个报错精简一下去vcpkg的github issue中搜索,注意也要关注closed的issue
在这里插入图片描述
然后去详细看有没有类似的错误,看评论区是不是已经有人解决了这个问题
或者有工作人员修复了bug并且做了commit
在这里插入图片描述
这里我是找到了有人修复了这个bug,然后将分支合并到了主分支master,注意这里的日期
根据这个日期查找master提交历史中在这一天里相应的提交信息
在这里插入图片描述
复制后面的commit id就是新的基线,安装该基线下的库,就不会再出现前面的bug了,注意这里的commit id一定是master分支上的commit id。

报错read_contents(“D:\Library\vcpkg\scripts\vcpkgTools.xml”): no such file or directory

在vcpkg所在目录执行

# 在 vcpkg 目录下执行初始化脚本(Windows 系统)
.\bootstrap-vcpkg.bat
# 若执行失败,可尝试强制重新生成(添加 --clean 选项)
.\bootstrap-vcpkg.bat --clean

可能是因为更新了vcpkg,但是没有重新生成vcpkg.exe文件

参考文献

官方教程
VCPKG安装和使用教程
C++包管理 vcpkg 教程(基础)

http://www.xdnf.cn/news/19061.html

相关文章:

  • day22 回溯算法part01
  • 服务器类型与TCP并发服务器构建(SELECT)
  • 设计模式:桥接模式(Bridge Pattern)
  • 《Linux内存管理:实验驱动的深度探索》【附录】【实验环境搭建 7】【使用buildroot方式构建文件系统】
  • 【开发便利】让远程Linux服务器能够访问内网git仓库
  • 链表-25.k个一组翻转链表-力扣(LeetCode)
  • 深入解析 Flink Function
  • Vue将内容生成为二维码,并将所有二维码下载为图片,同时支持批量下载(下载为ZIP),含解决一次性生成过多时页面崩溃解决办法
  • TCP 并发服务器构建
  • 智芯MCU 勘误文档问题解析
  • 【Java知识】Java线程相关对象全面解析与最佳实践
  • 阿里云——应用交付与负载均衡
  • 数据对话的“通用语法”:SQL与KingbaseES的智能处理艺术
  • 从感知机到大模型:神经网络的全景解析与实践指南
  • ES01-环境安装
  • 盛大启幕!融智兴科技亮相 IOTE 2025 深圳国际物联网展
  • SegEarth-R1: Geospatial Pixel Reasoning via Large Language Model
  • 稀土:从“稀有”到“命脉”的科技核心
  • LeetCode算法日记 - Day 23: 外观数列、数青蛙
  • LeetCode - 155. 最小栈
  • 8.28 模拟
  • rust语言(1.88.0)sqlite数据库rusqlite库(0.37.0)学习笔记
  • 蘑兔音乐:帮你把灵感落地
  • 【新版发布】Apache DolphinScheduler 3.3.1 正式上线:更稳、更快、更安全!
  • 【Django + Pure Admin】基于Django+Vue3的前后端分离管理系统框架设计
  • 预处理详解
  • 【Spring Cloud 微服务】5.架构的智慧枢纽:深度剖析 Nacos 注册中心
  • 《Vuejs设计与实现》第 17 章(编译优化)
  • JMeter 5.3 性能测试:文件下载脚本编写与导出文件接收完整指南
  • 数据结构:堆排序 (Heap Sort)