【问题标题】:Building libcurl with SSL support on Windows在 Windows 上构建带有 SSL 支持的 libcurl
【发布时间】:2010-09-16 21:09:32
【问题描述】:

我在 Win32 C++ 应用程序中使用 libcurl。

我已将 curllib.vcproj 项目添加到我的解决方案中,并将我的其他项目设置为依赖它。

如何在启用 SSL 支持的情况下构建它?

【问题讨论】:

  • 借助最近的 libcurl (2012),您可以使用预处理器符号 USE_WINDOWS_SSPI 和 USE_SCHANNEL 而不是 OpenSSL 构建对 Windows 的原生 SSL 支持
  • @fa 您可能希望发表您的评论作为完整答案。有些人可能会在评论部分错过它,这确实是在 Windows 上运行的最简单方法。感谢您的提示。

标签: winapi ssl curl openssl libcurl


【解决方案1】:

好吧,由于这篇文章失败得很厉害,我不得不自己深入研究这个问题。

还可以查看其他答案和 cmets,了解有关其他版本等的更多信息。

编辑:自从我发布了这个 Q 之后,似乎可以从 curl 主页获得现成的二进制文件。查看James' answer

所以这里是:

-

预处理器

需要将以下两个符号提供给预处理器以启用 libcurl 的 SSL:

USE_SSLEAY
USE_OPENSSL

(libcurl 使用 OpenSSL 来支持 SSL)

或者,可以将符号直接添加到 libcurl 中名为 setup.h 的文件中,但我不太乐意修改 3rd 方发行版中的代码,除非我真的必须这样做。

重建 libcurl 库,我现在收到一些关于 OpenSSL 包含文件未找到的错误。当然,因为我还没有正确设置 OpenSSL 发行版。

编译 OpenSSL 二进制文件

我下载了 OpenSSL 0.9.8 源代码分发包并解压。

在源代码分发的根目录中有一个名为 INSTALL.W32 的文件,它描述了如何编译 OpenSSL 二进制文件。构建链需要 perl,所以我安装了最新版本的 ActivePerl。

我在构建过程中遇到了一些问题,这可能不适用于所有系统,但我会在这里进行介绍,以防有人遇到同样的情况。

根据 INSTALL.W32:

在当前目录设置为源分发根目录的情况下运行以下命令行任务:

1> perl Configure VC-WIN32 --prefix=c:/some/openssl/dir

(其中 "c:/some/openssl/dir" 应替换为应安装 OpenSSL 的目录。请勿在此路径中使用空格。在这种情况下,进一步的编译将失败)

2> ms\do_ms

对我来说,这一步起初是不成功的,因为我缺少环境变量 OSVERSION 和 TARGETCPU。我将它们分别设置为 5.1.2600x86。你可能会抱怨 OSVERSION 是“疯狂的”,但仔细观察,这个错误是针对 WinCE 的,不会影响 Win32 设置。要获取您的操作系统版本,请从命令提示符运行“ver”命令或运行 winver.exe。

3> nmake -f ms\nt.mak (for static library)

3> nmake -f ms\ntdll.mak (for DLL)

源现在编译。在我的笔记本电脑上花了大约 5 分钟。

编译完成后,库或二进制文件已放入:

distroot/out32 - 用于静态库构建

distroot/out32dll - 用于 DLL 构建

构建和链接

现在,回到 Visual Studio 并指出头文件的库和包含路径。包含文件位于 distroot/inc32/openssl

记得添加 libeay32.libssleay32.lib 作为链接器输入。

重建 libcurl 项目。

错误!

至少对我来说这个版本的 OpenSSL。 它抱怨 OpenSSL 标头之一中的 struct typedef。我找不到这方面的任何信息。经过一个小时的谷歌搜索,我打破了自己的原则,并从 OpenSSL 标头中注释掉了 typedef,幸运的是 libcurl 没有使用该符号,所以它构建得很好。

更新:正如 Jason 所指出的,这个问题似乎在 1.0.0a 版本中消失了。

现在,为了确认已为 libcurl 启用 SSL 支持,请运行以下代码:

curl_version_info_data * vinfo = curl_version_info( CURLVERSION_NOW );
if( vinfo->features & CURL_VERSION_SSL )
    // SSL support enabled
else
    // No SSL

就这么简单。

【讨论】:

  • 谢谢。太糟糕了,libcurl 的家伙没有提供可以在 Windows 中使用的东西。
  • 使用 openssl-1.0.0.a,您不需要注释掉 typedef(最后一步)。它只是工作。
  • 您能否更新您的(真棒)答案以提醒人们将 libeay32.lib 和 ssleay32.lib 添加到静态构建的链接器输入?
  • 另外,要查找 windows 版本字符串,只需使用 Start |运行 | winver.exe。
  • 借助最近的 libcurl (2012),您可以使用预处理器符号 USE_WINDOWS_SSPI 和 USE_SCHANNEL 而不是 OpenSSL 为 Windows 构建原生 SSL 支持。
【解决方案2】:

也许这不是任何人都在寻找的答案,但我只是从 this link 下载了预编译的 DLL,在 http://curl.haxx.se/download.html 找到

我运行了 Sharkin 提供的测试,if( vinfo->features & CURL_VERSION_SSL ) 被证明是正确的。

【讨论】:

  • 不错!我猜这些垃圾箱是在我发布 Q 之后添加的。这确实是我当时正在寻找的东西。
  • 我下载了提到的预编译 dll,并添加了 libcurl.dll、libeay32.dll 和 libssl32.dll 作为附加链接器依赖项,但链接失败并出现错误 1>E:\curl-7.21.4- ssl-sspi-zlib-static-bin-w32\libcurl.dll:致命错误 LNK1107:无效或损坏的文件:无法在 0x308 读取
【解决方案3】:

根据 Robert Oschler 的建议,以下是我对该问题的评论作为答案:

您可以使用预处理器符号 USE_WINDOWS_SSPI 和 USE_SCHANNEL 而不是 OpenSSL 来构建最新的 libcurl (2012),并为 Windows 提供原生 SSL 支持。

【讨论】:

    【解决方案4】:

    在 Windows 上使用 Visual Studio 2010 编译 OpenSSL 1.0.0 时,最终抛出 0x2 错误:

    NMAKE : 致命错误 U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0 \VC\BIN\cl.EXE"' : 返回码'0x2'

    停止。

    似乎这个错误会因为perl配置文件中的一个标志,即-WX而抛出。 正如 MSDN 文档所述:

    将所有编译器警告视为错误。对于一个新项目,最好在所有编译中使用 /WX;解决所有警告将确保尽可能少的难以发现的代码缺陷。

    在配置文件中删除 -WX 出现并重新输入声明 here 的命令后,它构建良好并通过了所有测试。

    【讨论】:

    【解决方案5】:

    在我的情况下,遵循 curl README 文件就足够了。
    我的配置如下:

    • Visual Studio 2015 (VC14)
    • 静态库
    • Win64
    • 卷曲版本 7.57.0
    • OpenSSL 1.0.2

    libCurl的编译

    1. 在那里下载 libcurl 源代码:https://curl.haxx.se/download.html
    2. 解压文件并进入文件夹curl-7.57.0\projects
    3. 打开 README 文件并按照说明进行操作,这将引导我执行以下操作:
      • 已下载OpenSSL
      • 解压并重命名为openssl将其放在 curl 文件夹旁边,这很重要,因为您将打开希望在其中找到 openssl 的 VS 项目。
      • 安装Perl
      • 执行实用程序build-openssl.bat 以执行openSSL 的编译。使用我的设置,这变成了以下内容:
        .\build-openssl.bat vc14 x64 release ..\..\openssl\
        只需运行.\build-openssl.bat -help 以了解有关参数的更多信息。
        之后,您可以看到 OpenSSL 已编译,因为您在此处获得了一个新文件夹:openssl\build\Win64
    4. 打开 Visual Studio 项目curl-7.57.0\projects\Windows\VC14\curl-all.sln
    5. 确保将 Visual Studio 项目设置为您需要的构建配置(在我的情况下为LIB Release - LIB OpenSSL
    6. 全部构建
    7. 图书馆位于curl-7.57.0\build\Win64\VC14\LIB Release - LIB OpenSSL\libcurl.lib

    备注

    • 别忘了在你自己的项目中定义CURL_STATICLIB预处理器
    • 使用静态库,您必须链接 libcurl 的依赖项,请参阅this answer
    • 您可能不想依赖 LDAP,在这种情况下,您可以通过设置预处理器 CURL_DISABLE_LDAP 来禁用它在编译 libcurl 之前

    【讨论】:

    • 谢谢你,效果很好!我要为其他使用它的人指出的一件事是确保将 Visual Studio 项目设置为正确的配置,我不小心选择了 OpenSSL 和 libSSH2(facepalm!)
    【解决方案6】:

    如果您使用 Visual Studio IDE 构建并收到 58 个奇怪的警告,例如

    “不一致的 dll 链接 curl_global_init / curl_msnprintf /...”

    您应该将 CURL_STATICLIB 添加到预处理器定义中。

    所以整个定义行应该是这样的:

    USE_SSLEAY;USE_OPENSSL;CURL_STATICLIB。

    这样所有警告都会消失。

    有些人会忽略警告并继续使用库,但随后会得到相应的 *error*s,例如 curl_global_init / curl_msnprintf。这可能很烦人。

    希望它可以帮助某人。

    【讨论】:

      【解决方案7】:
      \ fatal error C1083: Cannot open include
      file: 'stdlib.h': No such file or directory
      NMAKE: fatal error U1077::return code 
      

      可以通过在 Visual Studio 中执行 vcvarsall.bat 来解决该错误。

      【讨论】:

        【解决方案8】:

        如何在 Windows 上使用 OpenSSL(SSL 支持)构建 libcurl C/C++

        1. 安装 libcurl
        2. 安装 OpenSSL
        3. 使用 OpenSSL 构建 libcurl

        安装 libcurl

        转到 download page of libcurl 并下载 Source Archives 下的 ZIP 文件。 在我的例子中,它被称为curl-7.58.0.zip

        提取存档并使用 Visual Studio 打开projects/Windows/VC15/curl_all.sln

        安装 OpenSSL

        下载 OpenSSL 的 windows 二进制文件。就我而言,我从Shining Light Productions distribution 下载了Windows 安装程序文件Win32 OpenSSL v1.1.0g

        我的安装文件夹是C:\OpenSSL-Win32

        使用 OpenSSL 构建 libcurl

        curl_all.sln Visual Studio 解决方案文件中,将构建配置更改为DLL Debug - DLL OpenSSL

        在解决方案资源管理器中,右键单击项目curl 并转到属性。

        Linker -> General 下修改Additional Library Directories 并将路径添加到您的OpenSSL directory + \lib。就我而言,这是C:\OpenSSL-Win32\lib

        应用并关闭属性窗口。

        右击项目libcurl,同上一步,在Linker -> General下添加OpenSSL directory + \libAdditional Library Directories

        C/C++ -> General 下,将C:\OpenSSL-Win32\include 添加到Additional Include Directories

        最后去Linker -> Input修改Additional Dependencies。将所有 lib 文件替换为以下内容:

        ws2_32.lib
        wldap32.lib
        openssl.lib
        libssl.lib
        libcrypto.lib
        

        应用并关闭属性窗口。

        DLL Debug - DLL OpenSSL 构建配置仍处于选中状态的情况下,转到Build -> Build Solution

        从OpenSSL bin目录(C:\OpenSSL-Win32\bin)复制两个dll文件libcrypto-1_1.dlllibssl-1_1.dll到刚刚创建的构建目录curl-7.58.0\build\Win32\VC15\DLL Debug - DLL OpenSSL

        验证构建

        在构建目录中,运行curld.exe。如果它运行时没有错误(缺少 dll 等),那么您的构建成功。

        【讨论】:

          【解决方案9】:

          我为 Windows 7 rc7100 做了“do_nt.bat” 不要忘记“nmake -f ms\nt.mak install”正确复制标题

          感谢这确实有很大帮助

          【讨论】:

            【解决方案10】:

            响应和/或补充上述内容的几条注释..

            首先,如果您不想与 ActivePerl 混淆,Strawberry Perl 非常棒,并且非常适合。

            其次,如果可能的话,我会建议使用 do_masm 代替 do_ms.bat,因为根据 INSTALL.W32,

            这是值得的,因为它会 导致更快的代码:例如它 通常会导致 2 次 RSA 例程中的加速。

            此外,构建 OpenSSL 的 0.9.8l (L) 是一场噩梦,所以我最终放弃并恢复到构建并(静态)链接的 0.9.8k libcurl 1.9 没有问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-07-05
              • 2017-11-21
              • 1970-01-01
              • 1970-01-01
              • 2017-07-21
              • 1970-01-01
              • 1970-01-01
              • 2019-06-03
              相关资源
              最近更新 更多