• 使用vcpkg管理依赖第三库



    使用vcpkg管理依赖第三库

    vcpkg 有两种操作模式:经典模式和清单模式。

    经典模式下,使用 vcpkg 作为命令行接口在vcpkg 安装目录中安装依赖项。 通常,位于中 %VCPKG_ROOT%/installed,其中 %VCPKG_ROOT% 是 vcpkg 的安装目录。

    清单模式下,在新建项目文件夹,在名为 vcpkg.json的清单文件中声明项目的直接依赖项。此模式下,会根据清单文件生成项目自己的vcpkg_installed目录,用于安装依赖项,这与经典模式不同,经典模式的所有包都安装在公共 %VCPKG_ROOT%/installed 目录中。 因此,每个项目都可以有自己的清单和自己的一组不与其他项目的依赖项冲突的依赖项。
    而且,只有清单模式才能使用高级功能,例如 版本控制自定义注册表
    使用清单模式安装包,这是大多数用户推荐的工作流。

    vcpkg安装

    找到vcpkg的github目录

    克隆到本地目录:

    > git clone https://github.com/Microsoft/vcpkg
    
    • 1

    进入vcpkg目录,启动安装:

    > .\vcpkg\bootstrap-vcpkg.bat
    
    • 1

    等待程序下载vcpkg.exe结束,脚本运行完毕。

    这里需要注意:

    1.必须用git下载vcpkg工作空间,否则项目清单模式应用时,为项目依赖库添加版本控制时,命令‘vcpkg x-update-baseline --add-initial-baseline’无法为清单文件添加基线版本。
    2.windows平台使用PowerShell工具,且需要最新版本,找到PowerShell的github官网下载安装。

    vcpkg经典模式使用

    从仓库列表搜索依赖项

    > vcpkg search zlib
    
    • 1

    从某个基线版本的列表中查询某个依赖项信息

    > git show 2815578f4a3486cec24c9b07d17e18e03bbaf667:versions/baseline.json | egrep -A 3 -e '"zlib"|"fmt"|"curl"'
    
    • 1

    注意:

    1.基线版本号就是vcpkg的github目录的提交记录的SHA哈希值。
    2.egrep 是unix和linux中的命令,故需要在git的命令行窗口来使用。

    关于基线版本号如何获取?
    首先到vcpkg的github官网,然后找到commits,如下图所示
    在这里插入图片描述
    在commits页面,选择需要的提交版本号的SHA哈希值
    在这里插入图片描述

    安装依赖库

    # 默认安装
    > vcpkg install curl
    # 安装支持OpenSSL的curl
    > install curl[openssl]
    # 安装支持OpenSSL和LibSHH2的curl
    > install curl[openssl,ssh]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    vcpkg清单模式的使用

    vcpkg清单模式的使用例子说明

    示例项目文件目录

    hello
    |  -- build/ : 项目的CMake构建目录
    |  -- CMakeLists.txt : 项目的CMake文件
    |  -- main.cpp
    L  -- vcpkg.json : vcpkg的项目级管理清单文件
    
    • 1
    • 2
    • 3
    • 4
    • 5

    main.cpp:

    #include 
    #include 
    
    int main()
    {
        fmt::print("fmt version is {}\n"
                   "zlib version is {}\n", 
                   FMT_VERSION, ZLIB_VERSION);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    CMakeLists.txt:

    cmake_minimum_required(VERSION 3.18)
    
    project(versionstest CXX)
    
    add_executable(main main.cpp)
    
    find_package(ZLIB REQUIRED)
    find_package(fmt CONFIG REQUIRED)
    target_link_libraries(main PRIVATE ZLIB::ZLIB fmt::fmt)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    vcpkg.json:

    {
        "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
        "name": "hello",
        "version": "0.0.1",
        "description": "vcpkg study tutorial: hello",
        "dependencies": [
            "fmt",
            {
                "name": "zlib",
                "platform": "windows & x64"
            },
            {
                "name": "curl",
                "platform": "windows & x64",
                "version>=": "8.1.2",
                "features": [
                    "ssh",
                    {
                      "name": "openssl",
                      "platform": "windows & x64"
                    }
                ]
            }
        ],
        "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
        "overrides": [
            {
                "name": "fmt",
                "version": "10.1.1"
            }
        ]
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    构建流程:

    # %VCPKG_ROOT%表示VCPKG.exe所在的根目录
    > cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
    # CMake构件编译系统后,针对Visual Studio项目,需要用软件打开sln解决方案编译
    
    • 1
    • 2
    • 3

    说明:
    使用基线添加版本约束:

    # 针对vcpkg.json清单文件未添加"builtin-baseline"的情况,在清单文件所在目录运行命令:
    > vcpkg x-update-baseline --add-initial-baseline
    
    • 1
    • 2

    使用基线添加版本约束的含义是,基线确定了vcpkg的github仓库中各个库包的最低版本。

    添加最低版本约束:
    基线不是锁定包版本的唯一方法。 vcpkg 还接受形式的 **version>=**最低版本约束。

    "dependencies": [
            "fmt",
            {
                "name": "zlib",
                "platform": "windows & x64"
            },
            {
                "name": "curl",
                "platform": "windows & x64",
                "version>=": "8.1.2",
                ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    强制使用特定版本:
    在某些情况下,可能需要强制使用特定版本的包,例如:

    • 解决版本冲突。
    • 锁定早于基线的版本。
    • 锁定其他无法比拟的版本,例如: vista、 xp。
    ...
    "overrides": [
            {
                "name": "fmt",
                "version": "10.1.1"
            }
        ]
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    关于使用基线添加版本约束添加最低版本约束强制使用特定版本三者的关系:
    见示例:

    {
      "dependencies": [
        {
            "name": "fmt",
            "version>=": "10.1.1"
        },
        "zlib"
      ],
      "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc", 
      "overrides": [
        { 
            "name": "zlib", 
            "version": "1.2.8"
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    3426db05b996481ca31e95fff3734cf23e0f51bc使用基线添加版本约束:

    • fmt:“version>=”: “7.1.3”
    • zlib:“version”:“1.2.11”

    添加最低版本约束:

    • fmt:“version>=”: “10.1.1”

    强制使用特定版本:

    • zlib:“version”:“1.2.8”

    安装时,fmt最终采用了添加最低版本约束,zlib最终采用了强制使用特定版本
    说明:强制使用特定版本有最高优先级,使用基线添加版本约束强制使用特定版本的版本低时,使用强制使用特定版本

  • 相关阅读:
    面向5G通信的射频关键技术解决毫米波传播距离短难题
    Linux线上环境问题排查命令
    如何使用Excel进行设备管理:巡检、维修、保养、备件管理
    【Spring内容进阶 | 第三篇】AOP进阶内容
    PMP每日一练 | 考试不迷路-7.20
    秋招每日一题------剑指offer41(数据流中的中位数)
    PAT 乙级 1002 写出这个数(思路+AC代码)
    计算机毕业设计ssm出租车预约系统o8i8r系统+程序+源码+lw+远程部署
    进程之间的通信方式(共享存储,消息传递,管道通信)
    PMP考试敏捷占比有多少?解疑
  • 原文地址:https://blog.csdn.net/xys206006/article/details/133936059