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