[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库为例
- 下载源码
可以直接下载zip也可以git clone,推荐使用git,后续更新vcpkg会更方便git pull
即可 - 运行
.\bootstrap-vcpkg.bat
,就会在当前目录生成vcpkg.exe - 建议将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 教程(基础)