记录: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

相关推荐
太空眼睛4 天前
【MCP】使用SpringBoot基于Streamable-HTTP构建MCP-Server
spring boot·sse·curl·mcp·mcp-server·spring-ai·streamable
特立独行的猫a7 天前
[鸿蒙PC命令行程序移植实战]:交叉编译移植最新openSSL 4.0.0到鸿蒙PC
华为·harmonyos·移植·openssl·交叉编译·鸿蒙pc
风清扬_jd7 天前
libcurl 开启https一键编译指南【MT方式】
c++·https·curl
十五年专注C++开发11 天前
CMake进阶:vcpkg中OpenSSLConfig.cmake详解
c++·windows·cmake·openssl·跨平台编译
一个平凡而乐于分享的小比特11 天前
OpenSSL 全面解析:从入门到精通
密码学·openssl·隐私安全
mooyuan天天15 天前
万字详解心脏滴血漏洞复现:原理详解+环境搭建+渗透实践(CVE-2014-0160)
openssl·心脏滴血漏洞·cve-2014-0160
bkspiderx20 天前
OpenSSL全解析:从基础原理到交叉编译与实战应用
openssl
码农爱学习23 天前
curl编程实例-上传文件
curl
ZXF_H1 个月前
C/C++ OpenSSL自适应格式解析证书二进制字节流
c语言·开发语言·c++·openssl