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

相关推荐
Lsetea2 天前
OpenSSL verify报invalid CA certificate:basicConstraints与keyCertSign排查
运维·https·ssl证书·openssl·证书链
Lsetea3 天前
OpenSSL verify报error 62:证书主机名不匹配与-verify_hostname排查
运维·https·ssl证书·openssl·san
Lsetea3 天前
OpenSSL verify报certificate signature failure:error 7与证书签名排查
运维·https·ssl证书·openssl·证书链
Lsetea4 天前
curl指定CA目录仍报证书不受信任:--capath与OpenSSL rehash排查
运维·https·ssl·openssl·curl
Lsetea5 天前
OpenSSL报path length constraint exceeded:CA层级与pathlen排查
运维·https·ssl证书·openssl·证书链
Lsetea5 天前
OpenSSL s_client退出码为0却证书验证失败:严格校验与Shell管道排查
https·shell·ssl证书·openssl·tls
Lsetea5 天前
OpenSSL报permitted subtree violation:证书SAN与CA名称约束排查
运维·https·ssl证书·openssl·证书链
今年下半年6 天前
【网站连通性检测】java项目telnet、curl命令的使用
java·curl·telnet
Lsetea6 天前
OpenSSL verify报error 20:CAfile、fullchain与本地信任链分层排查
nginx·https·ssl证书·openssl·证书链
Lsetea14 天前
证书没到期却报certificate has expired:OpenSSL定位中间证书与系统时间
运维·https·ssl证书·openssl·证书链