「vcpkg」 微软 C++ 团队开发的在 Windows 上运行的 C/C++ 项目包管理工具,可以帮助您在 Windows 平台上获取 C 和 C++ 库

  1. vcpkg 自身也是使用 C++ 开发的 (而其他的 C++ 包管理大多并不是 C++ 开发的),并且 vcpkg 能够帮助用户在 Visual Studio 中,更好的使用这些安装好的库
  2. vcpkg 整合了 git,构建系统整合的 CMake,而绝大多数的 C++ 项目都可以直接或者间接的方式使用 CMake创建原生项目文件并构建。

    使用手册

    Vcpkg大量使用的psl脚本,所以官方强烈推荐使用PowerShell,而不是使用CMD命令行来执行各种操作

查看帮助:vcpkg --help

  1. .\vcpkg.exe remove --outdated #一键移除过时的包
  2. .\vcpkg.exe list #列出已安装的包

使用须知:

  1. Vcpkg仅支持Visual Studio 2015 update 3及以上版本(包括Visual Studio 2017),究其原因,很可能和c++11的支持度以及集成原理有关系
  2. Vcpkg默认使用电脑中最新的VC++编译器,如电脑中有VS2015、VS2017,则会使用VS2017的编译器
  3. 目前Vcpkg编译静态库,默认只支持MT模式。

安装Vcpkg

  1. 下载源码:https://github.com/microsoft/vcpkg
  2. 在vcpkg源码文件夹中,打开PowerShell ```shell PS D:\local\vcpkg> .\bootstrap-vcpkg.bat

Building vcpkg.exe …

pch.cpp archives.cpp checks.cpp chrono.cpp cofffilereader.cpp downloads.cpp enums.cpp files.cpp hash.cpp json.cpp machinetype.cpp parse.cpp strings.cpp stringview.cpp system.cpp system.print.cpp system.process.cpp unicode.cpp binarycaching.cpp binaryparagraph.cpp build.cpp buildenvironment.cpp cmakevars.cpp commands.autocomplete.cpp commands.buildexternal.cpp commands.cache.cpp commands.ci.cpp commands.ciclean.cpp commands.contact.cpp commands.cpp commands.create.cpp commands.dependinfo.cpp commands.edit.cpp commands.env.cpp commands.exportifw.cpp commands.format-manifest.cpp commands.integrate.cpp commands.list.cpp commands.owns.cpp commands.porthistory.cpp commands.portsdiff.cpp commands.search.cpp commands.setinstalled.cpp commands.upgrade.cpp commands.version.cpp commands.xvsinstances.cpp dependencies.cpp export.cpp export.chocolatey.cpp export.prefab.cpp d:\local\vcpkg\toolsrc\src\vcpkg\export.prefab.cpp(1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据 丢失 [D:\local\vcpkg\toolsrc\vcpkglib\vcpkglib.vcxproj] globalstate.cpp help.cpp input.cpp install.cpp platform-expression.cpp metrics.cpp packagespec.cpp paragraphparseresult.cpp paragraphs.cpp portfileprovider.cpp postbuildlint.buildtype.cpp postbuildlint.cpp remove.cpp sourceparagraph.cpp statusparagraph.cpp statusparagraphs.cpp tools.cpp triplet.cpp update.cpp userconfig.cpp vcpkgcmdarguments.cpp vcpkglib.cpp vcpkgpaths.cpp versiont.cpp visualstudio.cpp vcpkglib.vcxproj -> D:\local\vcpkg\toolsrc\msbuild.x86.release\vcpkglib.lib vcpkg.cpp 正在生成代码 All 23072 functions were compiled because no usable IPDB/IOBJ from previous compilation was found. 已完成代码的生成 vcpkg.vcxproj -> D:\local\vcpkg\toolsrc\msbuild.x86.release\vcpkg.exe vcpkgmetricsuploader.cpp 正在生成代码 All 9688 functions were compiled because no usable IPDB/IOBJ from previous compilation was found. 已完成代码的生成 vcpkgmetricsuploader.vcxproj -> D:\local\vcpkg\toolsrc\msbuild.x86.release\vcpkgmetricsuploader.exe

Building vcpkg.exe… done.

Telemetry

vcpkg collects usage data in order to help us improve your experience. The data collected by Microsoft is anonymous. You can opt-out of telemetry by re-running the bootstrap-vcpkg script with -disableMetrics, passing —disable-metrics to vcpkg on the command line, or by setting the VCPKG_DISABLE_METRICS environment variable.

Read more about vcpkg telemetry at docs/about/privacy.md

  1. 3. 可以配置一个环境变量,方便在任何文件夹下都能运行vcpkg命令,`Path = D:\local\vcpkg`
  2. <a name="71WzX"></a>
  3. ## 安装一个开源库
  4. 只需列出Vckpg所支持的开源库列表,并找到对应的库名称,运行命令安装即可
  5. ```powershell
  6. .\vcpkg.exe search
  7. .\vcpkg.exe install jsoncpp

我们大致可以了解到install会经历这几个过程:

  1. 环境初始化
  2. 下载源代码(如果已经在cache中,则不下载)
  3. 校验文件有效性
  4. 解压缩源代码
  5. 利用配套工具配置源码工程,在这里是使用的是cmake(如果是ffmpeg,则用msys2)
  6. 编译源码。一般会同时编译Release和Debug版本。
  7. 把编译好的文件拷贝到相关目录中去(一般是installed目录)

注意点:如果电脑中没有安装cmake,vcpkg会自动下载portable版本的cmake。但是由于各种原因,下载的网速很慢,所以建议先自行下载安装msi版本的cmake。最好是下载最新版本的cmake。

指定平台版本

Vcpkg默认把开源库编译成Windows x86的版本,有两种方式指定版本:

  1. 设置环境变量VCPKG_DEFAULT_TRIPLET = x64-windows
  2. 命令中添加后缀进行指定x64-windows。以安装CGAL为例:./vcpkg.exe install cgal:x64-windows

Vcpkg一共支持以下系统,可以使用.\vcpkg.exe help triplet查看

  • arm-uwparm64-uwp
  • arm-windowsarm64-windows
  • x86-uwpx64-uwp
  • x86-windowsx86-windows-static
  • x64-windowsx64-windows-static

Note:需要非常注意的是,在使用Vcpkg时,有涉及到平台版本的时候,缺省值都是windows x86。为了避免不必要的麻烦,建议每次都以后缀形式指定版本

移除一个开源库

移除一个已经安装的开源库:

  1. .\vcpkg.exe remove jsoncpp

需要注意的是:

  1. 若不指定平台版本,默认移除x86-winodws。所以最好指定,如vcpkg.exe remove jsoncpp:x64-windows
  2. 移除也只是移除了二进制程序库而已,源码包和解压缩的源码并没有删除

    导入、导出已安装库

    无论是因为共享,还是备份,我们都可能需要导出已安装的库。

    1. .\vcpkg.exe export jsoncpp --7zip
    2. .\vcpkg.exe import xxx.7z
  3. 导出:vcpkg-export-<日期>-<时间>

  4. 指定输出目录和特定文件名,使用--output=参数指定
  5. 导出格式支持5种:--raw以目录形式;--nuget--ifw--zip--7zip

    设置Vcpkg的环境变量(指定VC++的版本等)

    设置环境变量的文件路径:{VCPKG_ROOT}\triplets\x64-windows.cmake

    1. set(VCPKG_TARGET_ARCHITECTURE x64)
    2. set(VCPKG_CRT_LINKAGE dynamic)
    3. set(VCPKG_LIBRARY_LINKAGE dynamic)
    4. set(VCPKG_PLATFORM_TOOLSET v140)

    使用Vcpkg安装的库(集成)

    如何使用Vcpkg安装的包?

  6. 常规情况下,我们需要设置include目录、lib目录等,会有很多工作量

  7. Vcpkg提供了一套机制,可以全自动的适配目录,而开发者不需要关心已安装的库的目录在哪里,也不需要设置。这是Vcpkg的一大优势。

「集成」:我们把使用库这个过程称之为集成

集成到全局

“集成到全局”适用于Visual Studio开发环境和msbuild命令行

  1. PS D:\local\vcpkg> .\vcpkg.exe integrate install
  2. Applied user-wide integration for this vcpkg root.
  3. All MSBuild C++ projects can now #include any installed libraries.
  4. Linking will be handled automatically.
  5. Installing new libraries will make them instantly available.
  6. CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=D:/local/vcpkg/scripts/buildsystems/vcpkg.cmake"

移除全局:

  1. PS D:\local\vcpkg> .\vcpkg.exe integrate remove
  2. User-wide integration was removed

集成到工程

“集成到工程”是整个vcpkg中最复杂的一项,它需要利用Visual Studio 中的nuget插件来实现
(1)在Vcpkg中生成NuGet配置文件

  1. .\vcpkg integrate project #在<vcpkg_dir>\scripts\buildsystems目录下生成NuGet配置文件

(2)在NuGet中添加源

  1. 打开Visual Studio,点击菜单“工具->NuGet包管理器->程序包管理器设置”,进入设置界面,点击“程序包源”
  2. 点击“加号”增加一个源。修改源的名字为vcpkg。在“源”的选项中点击右侧的”…”选择vcpkg目录下的“scripts\buildsystems”目录,然后点击右侧的“更新按钮”。
  3. 点击“确定”,关闭设置对话框。

(3)工程设置

  1. 打开VS工程
  2. 右键点击需要设置的工程,选择“管理NuGet程序包”
  3. 在右上角的“程序包源”中选择刚刚设置的“vcpkg”。这样在“浏览”选项卡中就可以看到“vcpkg.D.local.vcpkg”。
  4. 点击最右侧的“安装”。这样就可以将vcpkg安装的所有包集成到某个工程了。

    集成到CMake

    在cmake中集成只要在cmake文件中加入下面这句话即可。

    1. -DCMAKE_TOOLCHAIN_FILE=<vcpkg_dir>/scripts/buildsystems/vcpkg.cmake"

    附:使用静态库

    Vcpkg默认编译链接的是动态库,如果要链接静态库,目前还没有简便的方法。需要做如下操作

  5. 用文本方式打开vcxproj工程文件

  6. 在xml的段里面增加如下两句话即可

    1. <VcpkgTriplet>x86-windows-static</VcpkgTriplet>
    2. <VcpkgEnabled>true</VcpkgEnabled>

    在CMake中集成静态库,需要额外指令

    1. cmake .. -DCMAKE_TOOLCHAIN_FILE=.../vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x86-windows-static

    错误合集

    下载失败Failed to download file

    下载失败:Failed to download file
    image.png
    解决方案:手动下载文件,并存在download文件夹中, 重命名成temp里的文件名

  7. 打开网址:https://raw.githubbusercontent.com/boostorg/boost/boost-1.73.0/LICENSE_1_0.txt,将此文件(LICENSE_1_0.txt)另存到cvpkg/downloads

  8. cvpkg/downloads/temp/中找到该文件的名字boost_LICENSE_1_0.txt
  9. vcpkg/downloads/LICENSE_1_0.txt重命名为boost_LICENSE_1_0.txt
  10. 附:如果还报错(hash错误),在scripts/cmake中搜索原来的hash,并修改hash

参考链接

Please install the English language pack.

image.png

  1. Additional packages (*) will be modified to complete this operation.
  2. Warning: The following VS instances are excluded because the English language pack is unavailable.
  3. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community
  4. Please install the English language pack.
  1. 打开visual studio installer,下载英文语言包

image.png

  1. 将VS2017改成英文

image.png

参考文章

  1. 较全面的介绍Vcpkg