我在Win32 C ++应用程序中使用libcurl。
我已将curllib.vcproj项目添加到我的解决方案中,并将其他项目设置为依赖它。
如何在启用SSL支持的情况下构建它?
答案 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文件就足够了 我的配置如下:
curl-7.57.0\projects
curl-7.57.0\projects\Windows\VC14\curl-all.sln
LIB Release - LIB OpenSSL
)curl-7.57.0\build\Win64\VC14\LIB Release - LIB OpenSSL\libcurl.lib
CURL_STATICLIB
预处理器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)
转到download page of libcurl并在源存档下载入ZIP文件。 就我而言,它被称为curl-7.58.0.zip
提取存档并使用Visual Studio打开projects/Windows/VC15/curl_all.sln
。
下载OpenSSL的Windows二进制文件。就我而言,我从Win32 OpenSSL v1.1.0g
下载了Windows安装程序文件Shining Light Productions distribution。
我的安装文件夹是C:\OpenSSL-Win32
。
在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.dll
和libssl-1_1.dll
从OpenSSL bin目录(C:\OpenSSL-Win32\bin
)复制到刚刚创建的构建目录curl-7.58.0\build\Win32\VC15\DLL Debug - DLL OpenSSL
。
在构建目录中,运行curld.exe
。如果它运行时没有错误(缺少dll等),那么你的构建成功了。