在Windows上使用SSL支持构建libcurl

时间:2008-10-13 12:39:40

标签: winapi ssl curl openssl libcurl

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

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

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

10 个答案:

答案 0 :(得分:48)

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

另请查看其他答案和评论,了解有关其他版本等的其他信息。

编辑:自从我发布此Q以来,似乎已经从curl主页提供了现成的二进制文件。查看James' answer

所以这里是:

-

<强>预处理

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

USE_SSLEAY
USE_OPENSSL

(libcurl使用OpenSSL进行SSL支持)

或者,这些符号可以直接添加到libcurl中名为setup.h的文件中,但是我不太乐意修改第三方发行版中的代码,除非我真的需要。

重建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.2600 x86 。您可能会抱怨OSVERSION“疯狂”,但仔细观察,此错误适用于WinCE,不会影响Win32设置。要获取操作系统版本,请从命令提示符运行“ver”命令或运行winver.exe。

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

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

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

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

distroot / out32 - 用于静态库构建

distroot / out32dll - 用于DLL构建

构建和关联

现在,回到visual studio并指出libs并包含标题的路径。包含文件位于 distroot / inc32 / openssl

请记住将 libeay32.lib ssleay32.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

这很简单。

答案 1 :(得分:8)

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

我进行了sharkin提供的测试,if( vinfo->features & CURL_VERSION_SSL )证明是真的。

答案 2 :(得分:5)

在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后,它构建正常并通过了所有测试。

答案 3 :(得分:5)

按照罗伯特奥斯勒的建议,这是我对这个问题的评论作为答案:

您可以使用预处理器符号构建最近的libcurl(2012),其中包含对Windows的本机SSL支持:USE_WINDOWS_SSPI和USE_SCHANNEL而不是OpenSSL。

答案 4 :(得分:3)

在我的情况下,按照卷曲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项目。< / LI>
    • 安装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
  8. 说明

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

答案 5 :(得分:2)

如果使用Visual Studio IDE构建并获得58个奇怪的警告,如

那样

“不一致的dll连接curl_global_init / curl_msnprintf /..."

您应该将CURL_STATICLIB添加到前处理程序定义中。

因此整个定义行应如下所示:

USE_SSLEAY; USE_OPENSSL; CURL_STATICLIB

这样所有警告都会消失。

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

希望它可以帮助某人。

答案 6 :(得分:2)

\ fatal error C1083: Cannot open include
file: 'stdlib.h': No such file or directory
NMAKE: fatal error U1077::return code 

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

答案 7 :(得分:1)

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

感谢这确实有很多帮助

答案 8 :(得分:1)

回应和/或除上述内容之外的几个笔记..

首先,如果您不想使用ActivePerl,Strawberry Perl非常棒并且完美地为此工作。

其次,除了使用 do_ms .bat之外,如果可能,我建议更喜欢 do_masm ,因为根据INSTALL.W32,

  

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

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

答案 9 :(得分:1)

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

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

    转到download page of libcurl并在源存档下载入ZIP文件。 就我而言,它被称为curl-7.58.0.zip

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

    安装OpenSSL

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

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

    使用OpenSSL构建libcurl

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

    在Solution Explorer中,右键单击项目curl,然后转到Properties。

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

    应用并关闭属性窗口。

    右键点击项目libcurl并执行与上一步相同的操作,将OpenSSL directory + \lib添加到Additional Library Directories下的Linker -> General

    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

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

    验证构建

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