在Windows上构build带有SSL支持的libcurl

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

我有curllib.vcproj项目添加到我的解决scheme,并设置我的其他项目依赖于它。

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

那么因为这个post失败了,我不得不自己去深究。

另外检查其他答案和意见,其他信息的其他版本等

编辑:因为我发布这个Q似乎有从curl主页提供的现成的二进制文件。 看看詹姆斯的回答 。

所以在这里:

预处理器

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

USE_SSLEAY USE_OPENSSL 

(libcurl使用OpenSSL进行SSL支持)

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

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

编译OpenSSL二进制文件

我下载了OpenSSL 0.9.8源代码发行版,并将其解压。

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

我在编译时遇到了一些麻烦,这可能不适用于所有的系统,但我会在这里通过它,以防有人遇到相同的情况。

根据INSTALL.W32:

使用当前目录设置为源分布根目录运行以下命令行任务:

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

(其中“c:/ some / openssl / dir”应该被应该安装OpenSSL的dir所替代,不要在这个path中使用空格,在这种情况下进一步编译将会失败)

 2> ms\do_ms 

对我来说,这一步起初并不成功,因为我缺less环境variablesOSVERSION和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 – 用于静态库构build

要么

distroot / out32dll – 用于DLL构build

build设和连接

现在回到Visual Studio并指出这些库并包含标题的path。 包含文件位于distroot / inc32 / openssl中

请记住添加libeay32.libssleay32.lib作为链接器input。

重buildlibcurl项目。

错误!

至less对于我来说这个版本的OpenSSL。 它抱怨一个OpenSSL头文件中的struct typedef。 我找不到任何信息。 经过一个小时的search,我打破了我自己的原则,并从OpenSSL头注释了typedef,幸运的是libcurl没有使用这个符号,所以它build立好了。

更新:正如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 

就那么简单。

也许这不是任何人正在寻找的答案,但我只是从http://curl.haxx.se/download.html 这个链接下载预编译的DLL。

我运行了sharkin提供的testing, if( vinfo->features & CURL_VERSION_SSL )被certificate是正确的。

在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'

停止。

看来这个错误会因为perlconfiguration文件中的标志,即-WX而被抛出。 正如MSDN文档所述:

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

在configuration文件中删除了-WX事件并重新input这里所述的命令后,它build立好了,并通过了所有的testing。

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

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

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

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

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

谢谢这确实帮了很大忙

几个音符响应和/或除了上述..

首先,如果你不想惹恼ActivePerl,那么草莓Perl是非常棒的,并且非常适合这个。

其次,为了代替使用do_ms.bat ,我build议尽可能使用do_masm ,因为根据INSTALL.W32,

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

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

如果使用Visual Studio IDE进行构build,并获得58个类似的警告

“不一致的dll连接curl_global_init / curl_msnprintf / …”

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

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

USE_SSLEAY; USE_OPENSSL; CURL_STATICLIB。

这一切的警告将消失。

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

希望它能帮助别人。