我在Win32 C++应用程序中使用libcurl.
我已将curllib.vcproj项目添加到我的解决方案中,并将其他项目设置为依赖于它.
如何在启用SSL支持的情况下构建它?
好吧,由于这篇文章失败了,我不得不自己深入研究这个问题.
另外,请查看其他答案和评论,了解有关其他版本等的其他信息.
编辑:自从我发布此Q以来,似乎已经从curl主页提供了现成的二进制文件.查看詹姆斯的回答.
-
预处理器
需要将以下两个符号提供给预处理器以为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
就那么简单.
也许这是没有答案的人正在寻找,但我只是简单地从网上下载预编译的DLL 此链接在发现http://curl.haxx.se/download.html
我进行了sharkin提供的测试,并if( vinfo->features & CURL_VERSION_SSL )
证明是真的.
按照Robert Oschler的建议,这是我对这个问题的评论作为答案:
您可以使用预处理器符号构建最近的libcurl(2012),其中包含对Windows的本机SSL支持:USE_WINDOWS_SSPI和USE_SCHANNEL而不是OpenSSL.
在使用Visual Studio 2010在Windows上编译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事件并重新输入此处所述的命令后,它构建正常并通过了所有测试.