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

相关推荐
x-cmd1 天前
[260429] x-cmd v0.9.1:一键开启 DeepSeek-V4-Pro Max 模式 + 1M 上下文;顺手重构了 uuid 模块
windows·重构·uuid·claude·curl·x-cmd·deepseek-v4-pro
特立独行的猫a2 天前
移植 vcpkg 到鸿蒙 PC:vcpkg-tool 交叉编译与实践手记
华为·harmonyos·vcpkg·鸿蒙pc·vcpkg-tool
H Journey8 天前
windows下通过VSCode使用vcpkg 管理库开发opencv项目环境搭建
windows·vscode·opencv·vcpkg
特立独行的猫a9 天前
使用 vcpkg 将 pngquant 命令行移植到鸿蒙 PC(OpenHarmony )
华为·harmonyos·命令行·vcpkg·pngquant·三方库·鸿蒙pc
特立独行的猫a13 天前
使用 vcpkg 为OpenHarmony(鸿蒙PC)构建 OpenSSH 命令行工具
harmonyos·openharmony·命令行·openssh·vcpkg·鸿蒙pc
特立独行的猫a14 天前
HarmonyOS 鸿蒙PC三方库移植:vcpkg方式的 Port 脚本编写简明教程
华为·harmonyos·openharmony·vcpkg·三方库移植
ct681667816 天前
Visual Studio 工程配置相关
ide·visual studio·vcpkg
特立独行的猫a16 天前
HarmonyOS / OpenHarmony 平台三方库移植:使用vcpkg 移植 Crashpad 过程实战总结
harmonyos·移植·openharmony·vcpkg·crshpad
特立独行的猫a17 天前
HarmonyOS鸿蒙三方库移植:选 vcpkg 还是 lycium_plusplus?两种“框架化”方案对比
harmonyos·openharmony·vcpkg·三方库移植·鸿蒙pc·lycium_plusplus
特立独行的猫a17 天前
使用 vcpkg 为鸿蒙(HarmonyOS / OHOS)下载与安装三方库实践指南
华为·harmonyos·openharmony·vcpkg·三方库·鸿蒙pc