记录:vcpkg清单模式安装指定版本的curl和OpenSSL

0.前言

Python的pip安装指定版本的包很方便:

pip install numpy==1.21.0

pip install "pandas>=1.3.0,<2.0.0"

但vcpkg是没法在install里直接指定版本的,vcpkg提供了从清单文件安装依赖项的功能

vcpkg安装库经常遇到下载问题,可以先上飞机

1.安装OpenSSL1.1.1g

准备vcpkg.json放到vcpkg.exe同级目录

javascript 复制代码
{
  "name": "curl-openssl",
  "version-semver": "1.0.0",
  "dependencies": [
    {
      "name": "openssl",
      "platform": "windows"
    }
  ],
  "overrides": [
    {
      "name": "openssl",
      "version-string": "1.1.1g",
      "port-version": 1
    }
  ],
  "builtin-baseline": "1914114b6028c6ebf1fa9f17facaf0828a02a3c6"
}

更新builtin-baseline到当前commit版本:

./vcpkg x-update-baseline --add-initial-baseline

执行安装命令:

./vcpkg install --triplet x86-windows

会报错:

在versions目录下找到openssl.json,git查看更新记录,往前找到第一次出现1.1.1g的commit,替换到baseline,再次执行install,新的错误:

vcpkg.json将openssl和openssl-windows都指定版本:

javascript 复制代码
{
  "name": "curl-openssl",
  "version-semver": "1.0.0",
  "dependencies": [
    {
      "name": "openssl",
      "platform": "windows"
    },
    {
      "name": "openssl-windows",
      "platform": "windows"
    }
  ],
  "overrides": [
    {
      "name": "openssl",
      "version-string": "1.1.1g",
      "port-version": 1
    },
    {
      "name": "openssl-windows",
      "version-string": "1.1.1g",
      "port-version": 0
    }
  ],
  "builtin-baseline": "68a74950d0400f5a803026d0860f49853984bf11"
}

提示安装成功:

list命令查看安装结果:

把vcpkg.json中的dependencies库去掉,重新执行install就可以卸载掉没在清单中的库

测试发现后面新的OpenSSL版本,如1.1.1h和1.1.1n又不会提示循环依赖了,用1.1.1n在最新的baseline也可以安装

2.安装curl+OpenSSL1.1.1g

根据上面选择的baseline commit日期找到curl.json的提交记录,选择对应的curl版本,更新vcpkg.json配置:

javascript 复制代码
{
    "name": "curl-openssl",
    "version-semver": "1.0.0",
    "dependencies": [
        "zlib",
        {
            "name": "openssl",
            "platform": "windows"
        },
        {
            "name": "openssl-windows",
            "platform": "windows"
        },
        {
            "name": "curl",
            "features": [
                "openssl"
            ],
            "platform": "windows"
        }
    ],
    "overrides": [
        {
            "name": "openssl",
            "version-string": "1.1.1g",
            "port-version": 1
        },
        {
            "name": "openssl-windows",
            "version-string": "1.1.1g",
            "port-version": 0
        },
        {
            "name": "curl",
            "version": "7.73.0",
            "port-version": 0
        }
    ],
    "builtin-baseline": "68a74950d0400f5a803026d0860f49853984bf11"
}

执行安装命令:

./vcpkg install --triplet x86-windows

查看安装结果:

一般zlib静态链接,避免和其他的库冲突,在triplets目录找到x86-windows.cmake,复制粘贴改个自定义的名字,指定zlib静态链接,同时还能指定工具链版本,如VS2019即v142:

javascript 复制代码
set(VCPKG_TARGET_ARCHITECTURE x86)
set(VCPKG_PLATFORM_TOOLSET v142)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE dynamic)

if(PORT STREQUAL "zlib")
  set(VCPKG_LIBRARY_LINKAGE static)
endif()

在install时使用我们自己写的的triplet:

./vcpkg install --triplet x86-windows-curl

安装结束在生成目录可以看到zlib.dll没有了:

导出我们的库:

./vcpkg export --output-dir=./exports --raw

写一个Demo测试https访问是否正常:

cpp 复制代码
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp)
{
    size_t realSize = size * nmemb;
    std::string* buffer = static_cast<std::string*>(userp);
    buffer->append(static_cast<char*>(contents), realSize);
    return realSize;
}

void MainWindow::testCurl()
{
    curl_global_init(CURL_GLOBAL_DEFAULT);
    do {
        CURL *curl = curl_easy_init();
        if (!curl) break;

        std::string url = "https://httpbin.org/post";
        std::string body = R"({"username":"gongjianbo","password":"123456789"})";
        std::string response;

        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str());
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, body.size());

        struct curl_slist* headers = nullptr;
        headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        // 忽略证书验证
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);

        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        CURLcode res = curl_easy_perform(curl);

        if (res != CURLE_OK)
        {
            qDebug() << "curl error: " << curl_easy_strerror(res);
        }
        else
        {
            ui->textEdit->append(QString::fromStdString(response));
            qDebug() << "Response:" << QString::fromStdString(response);
        }

        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    } while(false);
    curl_global_cleanup();
}

3.本文参考

参考博客:https://blog.csdn.net/weixin_46486440/article/details/144994426

官方文档:https://learn.microsoft.com/zh-cn/vcpkg/consume/lock-package-versions?tabs=inspect-powershell

官方示例:https://learn.microsoft.com/zh-cn/vcpkg/consume/boost-versions

相关推荐
YouEmbedded12 小时前
解码ARM 开发板 OpenSSL+cURL 交叉编译与 HTTPS 配置
https·openssl·curl
吃西瓜的星星1 天前
从0开始完成ActiveMQ-cpp在windows_x86平台的编译(从编译openssl开始)
activemq·openssl·c/c++
慢慢向上的蜗牛17 天前
微软vcpkg包管理工具如何使用?
c++·microsoft·vcpkg·跨平台编译
赖small强23 天前
【ZeroRange WebRTC】OpenSSL 与 WebRTC:原理、集成与实践指南
webrtc·openssl·x.509·证书验证·tls/dtls
大米粥哥哥25 天前
c++ libcurl报错Send failed since rewinding of the data stream failed【已解决】
开发语言·c++·http·curl·rewind
openHiTLS密码开源社区1 个月前
密码学系统的核心防护:FUZZ测试(模糊测试)技术原理与行业实践
openssl·fuzz测试·模糊测试·形式化验证·openhitls
idolyXyz1 个月前
[curl-http3: 基于quiche+boringssl编译]
http3·curl·boringssl·quiche
叫我詹躲躲2 个月前
Linux 服务器磁盘满了?教你快速找到大文件,安全删掉不踩坑!
linux·前端·curl
叫我詹躲躲2 个月前
3 分钟搞定 Linux 磁盘清理:实用命令 + 自动脚本,新手也会
linux·curl