如何在 Windows x64 上使用 openSSL 和 nghttp2 编译 cURL?

Posted

技术标签:

【中文标题】如何在 Windows x64 上使用 openSSL 和 nghttp2 编译 cURL?【英文标题】:how do I compile cURL with openSSL and nghttp2 on Windows x64? 【发布时间】:2018-04-09 10:58:26 【问题描述】:

这里的第一个问题,请耐心等待 :) 过去 3 天我一直在网上试图找到一种方法来在我的 Windows 机器上获得以下结果。

example of 'cURL -V' output I need

我找到了很多适用于 macOS 和 unix 的东西,但只有一些适用于 Windows 的零碎东西。我正在运行 xampp,最终我试图让它通过 cURL/php 发送 http/2 请求。到目前为止,我收集到的是我需要使用一些库编译 cURL,例如 openssl(至少 1.0.2)、启用 http/2 的 libcurl 和 nghttp2。我觉得我很接近,但我只是错过了一些步骤。

到目前为止我做了什么:

为 Visual Studio 2017 安装了诸如 mingw32、cmake 和构建工具之类的东西 下载了 nghttp2-1.27.0,使用 'cmake' 和 'cmake --build' 得到 5 个文件:nghttp2.dll、.exp、.lik、.lib 和 .pdb 下载 curl-7.56.1.tar.gz(https://curl.haxx.se/download.html 上的第一个) 已下载 libssh2-1.8.0 已下载 openssl-1.0.2l 下载zlib-1.2.11 在 https://curl.haxx.se/docs/install.html 上按照 Mingw32 的说明进行操作(但它一直给我错误“找不到 openSSL 包”) 我在某处读到我需要使用 '--with-nghttp2 --prefix-[LOCATION OF NGHTTP2 FOLDER HERE]' 标志编译 cURL,所以我尝试了一些我认为可行的方法,但我不认为它做到了:'cmake --with-nghttp2 --prefix-[NGHTTP2 文件夹的位置]。 ',然后是 'cmake 安装。 ' 看起来它做了一些事情,但是在 curl-7.56.1/src/ 中构建的 cURL.exe 除了 libcurl 之外没有其他任何东西。

任何建议或指示将不胜感激!谢谢各位:)

【问题讨论】:

我建议使用 curl 的 winbuild/ 目录中的构建文件。 谢谢,我能够有所进展。这些是我采取的步骤:(1)下载curl-7.56.1.tar.gz并解压它(2)在curl-7.56.1文件夹内创建一个“deps”文件夹(3)下载zlib1.dlllibssh2.dllssleay32.dll + libeay32.dll (4) 将这四个 .dll 移动到 curl-7.56.1/deps (5) 打开 VS 2017 的开发人员命令提示符(我可以运行的一件事 nmake)(6) cd curl-7.56.1/winbuild (7 ) nmake /f Makefile.vc mode=dll WITH_SSL=ssleay32.dll WITH_NGHTTP2=nghttp2.dll WITH_ZLIB=zlib1.dll WITH_SSH2=libssh2.dll 这在curl-7.56.1/bin 中创建了一堆文件夹。它实际上做了一个 curl.exe,但它好像没有考虑到.dlls。我尝试删除WITH_xxx 标志,它在/bin 内的新文件夹中构建了一个win_ssl 版本的curl。我做错了什么? 【参考方案1】:

好的,我终于能够在支持 http/2 的 Windows 上构建 Curl。 这对我有用,一步一步:

下载“Build Tools for Visual Studio 2017”以便能够从命令行构建(提供nmake 和所需的 Windows SDK 库和头文件) 下载了最新版本的 curl,如上所述(curl-7.56.1.tar.gz,对我来说也是https://curl.haxx.se/download.html 上的第一个) 在c:/curl中提取它,所以我最终得到c:/curl/curl-7.56.1 阅读说明 BUILD.WINDOWS.txtc:/curl/curl-7.56.1/winbuild 中,然后前往 http://windows.php.net/downloads/php-sdk/deps/ 下载我需要的 4 个库。我刚拿到了 VC15/x86 版本。 在c:/curl/curl-7.56.1 中创建了一个名为“deps”的新文件夹 在c:/curl/curl-7.56.1/deps 中创建了以下3 个文件夹:binlibinclude 把我刚下载的每个库都解压到对应的3个文件夹中 为 VS 2017 打开了开发者命令提示符 cd c:/curl/curl-7.56.1/winbuild nmake -f Makefile.vc mode=dll WITH_DEVEL=c:/curl/curl-7.56.1/deps WITH_SSL=dll WITH_NGHTTP2=dll WITH_ZLIB=static WITH_SSH2=dll 这会在c:\curl\curl-7.56.1\builds 中的一个子文件夹中构建一个 CURL 可执行文件 当我第一次尝试运行 CURL 时,它显示一个错误,提示缺少 libssl-1_1.dlllibcrypto-1_1.dll,所以我不得不从 @ 复制它们987654337@到新建curl.exe所在目录 注意:由于 zlib 没有附带包含任何 .dllbin 文件夹,我理解为什么我必须使用 WITH_ZLIB=static 标志将 zlib 标记为静态。我不明白为什么我必须手动将 openssl .dll 移动到新目录中。有什么想法吗?

PS:感谢 Daniel 为我指明了正确的方向。我什至没有注意到/winbuild 目录。

PPS:正如您可能知道的那样,我 90% 的时间都不知道自己在做什么。可能是为什么我花了 5 天时间才弄清楚的原因;)

【讨论】:

您必须复制 dll 文件的原因是因为 Windows 没有 rpath,因此 DLL 应该在与可执行文件相同的文件夹中或在 DLL 查找路径上。跨度>

以上是关于如何在 Windows x64 上使用 openSSL 和 nghttp2 编译 cURL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 10 上使用 Visual Studio 2015 x64 配置和构建 Tesseract OCR C++

如何在 Windows x64 上使用 openSSL 和 nghttp2 编译 cURL?

如何在 Win x64 上使用 WinAPI 正确安装虚拟打印机?

如何在Windows 7(X64)上卸载VMWare Workstation 14

如何使用 cygwin 在 Windows 上构建 zeromq?

如何使用Windows x64记录堆栈帧