写在开始

  最近换了新的学习环境,给配备了一台全新的电脑,虽然配置较高,但是老实说,我也不是很想要,其一就是软件的安装与环境的配置是如此的一言难尽,加之前几天校园网不能使用,而我又没办理这边的校园流量卡,只能靠着BCH和SML两个人的流量苟且度日,使得电脑软件与环境的配置工作更是雪上加霜...环境的配置是最恶心人的,有时会莫名其妙出现乱七八糟的错误,使得一大段时间都投入在无效的繁琐工作里。
  在Windows的C++开发中,C++最大的诟病就是包管理,这是一件很让人头疼的事情,很多时候我们要用到各色各样的库,比如Qt、VTK...,如果每个库都需要我们自己去官网下载源码,然后编译,这样工作量非常大。此时我们应该发出疑问:C++中有没有类似于「Java中的Maven、Python中的pip(或是conda)、Node.js中的npm」的包管理软件呢?答案是有,在Windows环境下,Microsoft提供了一个名为“vcpkg”的包管理工具,但这个工具确实也不如上述其他语言中的包管理工具易用性那么强。
  很久之前我在大师兄WJC的帮助下配置过一次,时隔两年,现在已经忘得差不多了,所以借此机会,记录一下vcpkg的配置过程,以免后续遗忘,并帮助需要帮助的人。

vcpkg的安装与集成

前置条件:

  • 安装好git
  • 安装好Cmake (安装完VS可能自带,也可以自己提前安装)
  • 安装好Visual Studio 2022 (vcpkg会寻找VS实例,使用msvc对库进行编译构建)
  • 需要安装PowerShell 7.x,否则会提示PowerShell-core 7.x need错误

  PowerShell 7.x的下载可以通过Release of PowerShell页面进行,解压后即完成安装,打开pwsh.exe便是打开了PowerShell 7.x的终端。
PowerShell 7.x终端
为了方便使用右键快速打开,我们可以将其添加至注册表。

添加快速右键访问:

  • 打开注册表编辑器:按 Win + R 打开运行对话框,输入 regedit,然后按回车。
  • 导航到以下路径:HKEY_CLASSES_ROOT\Directory\Background\shell。
  • 右键点击 shell,选择 新建 -> 项,将其命名为 PowerShell 7.x.x。
  • 选择新建的 PowerShell 7.x.x 项,在右侧窗口中双击 (默认),将其值设置为 PowerShell 7.x.x。
  • 在 PowerShell 7.x.x 项下,右键点击,选择 新建 -> 项,将其命名为 command。
  • 选择 command 项,在右侧窗口中双击 (默认),将其值设置为 pwsh.exe 的完整路径,例如 D:\Applications\PowerShell-7.4.5-win-x64\pwsh.exe。

这样,就可以在右键菜单中看到并打开 PowerShell 7.4.5 了。

vcpkg的安装

  首先将vcpkg克隆下来:

git clone https://github.com/microsoft/vcpkg

  进入vcpkg文件夹,在控制台中运行执行下述命令,会看到生成了一个vcpkg.exe文件,此时代表vcpkg已经安装完成。

./bootstrap-vcpkg.bat

  接下来为vcpkg添加环境变量,以在任何地方都能使用vcpkg,这一步可以做,也可以不做,不做就只能进入vcpkg的路径执行./vcpkg才能执行命令。
添加系统环境变量
在Path中添加vcpkg

安装需要的库

  如果我们配置了环境变量,则可以直接使用vcpkg命令,否则只能进入vcpkg的路径执行./vcpkg才能执行命令。以配置了环境变量,需要安装qt5与qcustomplot为例,执行:

vcpkg install qt5:x64-windows
vcpkg install qcustomplot:x64-windows

等待所有库安装好即可。

在cmake项目中集成

  CMake工程占比越来越重,vcpkg对cmake的支持当然不能少,无论是Visual Studio还是Clion,在cmake中集成只要在cmake文件中加入下述一行代码即可:

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

也可以在CMakePresets.json中对vcpkg进行设置。

在CMake工程实践中, 经常需要使用不同的配置编译来编译代码,比如要编译Debug、Relase版本,32位、64位版本,动态链接,静态链接, 使用不同的编译器, 如gcc、msvc, 不同的平台,如Windows、Linux、Android等。如果在编译时在命令行中输入参数,或者临时改CMake脚本代码就会很麻烦,这时CMakePresets.json配置文件就派上用场了。

一个简单的CMakePresets.json示例如下:

{
  "version": 2,
  "configurePresets": [
    {
      "name": "windows-x64-debug",
      "displayName": "Windows x64 Debug",
      "description": "面向具有 Visual Studio 开发环境的 Windows。",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/out/build/${presetName}",
      "architecture": {
        "value": "x64",
        "strategy": "external"
      },
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
        "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
      },
      "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } }
    },
    {
      "name": "windows-x64-release",
      "displayName": "Windows x64 Release",
      "description": "面向具有 Visual Studio 开发环境的 Windows。",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/out/build/${presetName}",
      "architecture": {
        "value": "x64",
        "strategy": "external"
      },
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "RelWithDebInfo",
        "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
        "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
      },
      "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } }
    }
  ]
}

  在Clion中,还可以通过设置 -> 构建、执行、部署 -> CMake -> Cmake选项进行vcpkg集成。
Clion集成vcpkg
  集成完成后,重新加载cmake项目,即可享用vcpkg安装的库。

写在最后

  记录这篇笔记的历程是艰辛的,刚开始配环境时,都还是兴致勃勃的,随着不断地推进,遇到了各种的问题,首先是vcpkg来安装库的问题,是不是爆红,要么就是github连不上,要么就是库仓库没了,更离谱的是其对路径的长度还有要求,且库不支持回退(似乎只能安装最新版本的,也许是我不会用),版本的依赖关系vcpkg把握不准,直到最后,遇到了个很抽象的库qcustomplot,这个库debug和release编译后的库文件是分开的,分别叫qcustomplotd2.lib与qcustomplot2.lib,CmakeLists.txt为了在不同的编译方式下分别找到正确的库也做了努力:

find_path(QCUSTOMPLOT_INCLUDE_DIR NAMES qcustomplot.h PATHS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include" NO_DEFAULT_PATH)
include_directories(${QCUSTOMPLOT_INCLUDE_DIR})
if(CMAKE_BUILD_TYPE MATCHES "Debug")
    find_library(QCUSTOMPLOT_LIBRARY NAMES qcustomplotd2 PATHS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib" NO_DEFAULT_PATH)
else()
    find_library(QCUSTOMPLOT_LIBRARY NAMES qcustomplot2 PATHS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib" NO_DEFAULT_PATH)
endif()

  最终的结果就是能找到.h,所有程序都能编译通过,链接静态库的时候,死活找不到,一直报QCP的Link2001与Link2019的问题,非常无奈。尝试未果,也不知道怎么尝试,最终掏出了之前的vcpkg替换到现在刚下的vcpkg目录下,就神奇的解决了问题。不知道是不是因为vcpkg升级而导致寻找lib的方式变化了,还是qcustomplot升级而导致的,这件事导致我装这个环境花了两天时间,真是非常不开心。总之我对vcpkg现在抱有的是一种怀疑的态度,对C++的生态也感到消极,为什么不能有一个像conda、maven类似的,好用的包管理工具呢?想不明白!

最后修改:2024 年 09 月 14 日
如果觉得我的文章对你有用,请随意赞赏