我在 Win32 C++ 应用程序中使用 libcurl。
我将 curllib.vcproj 项目添加到我的解决方案中,并将我的其他项目设置为依赖它。
如何在启用 SSL 支持的情况下构建它?
好吧,由于这篇文章失败了,我不得不自己深入研究这个问题。
另请查看其他答案和评论,以获取有关其他版本等的更多信息。
编辑:自从我发布了这个 Q 之后,curl 主页似乎提供了现成的二进制文件。看看詹姆斯的回答。
-
预处理器
需要将以下两个符号提供给预处理器以启用 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.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 分钟。
编译完成后,库或二进制文件已放置在:
distroot/out32 - 用于静态库构建
或者
distroot/out32dll - 用于 DLL 构建
构建和链接
现在,回到 Visual Studio 并指出头文件的库和包含路径。包含文件位于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
就那么简单。
按照 Robert Oschler 的建议,以下是我对作为答案的问题的评论:
您可以使用预处理器符号(USE_WINDOWS_SSPI 和 USE_SCHANNEL 而不是 OpenSSL 的)构建最近的 libcurl (2012),并为 Windows 提供原生 SSL 支持。
在 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 出现并重新输入此处所述的命令后,它构建良好并通过了所有测试。
在我的情况下,遵循 curl 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
之前设置预处理器来禁用它。如果您使用 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。这可能很烦人。
希望它可以帮助某人。
\ fatal error C1083: Cannot open include
file: 'stdlib.h': No such file or directory
NMAKE: fatal error U1077::return code
该错误可以通过在 Visual Studio 中执行 vcvarsall.bat 来解决。
转到libcurl 的下载页面并下载Source Archives下的 ZIP 文件。在我的情况下,它被称为curl-7.58.0.zip
提取存档并projects/Windows/VC15/curl_all.sln
使用 Visual Studio 打开。
下载 OpenSSL 的 windows 二进制文件。就我而言,我Win32 OpenSSL v1.1.0g
从Shining Light Productions 发行版下载了 Windows 安装程序文件。
我的安装文件夹是C:\OpenSSL-Win32
.
在curl_all.sln
Visual Studio 解决方案文件中,将生成配置更改为DLL Debug - DLL OpenSSL
.
在解决方案资源管理器中,右键单击项目curl
并转到属性。
在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 文件从 OpenSSL bin 目录( )libcrypto-1_1.dll
复制到刚刚创建的构建目录。libssl-1_1.dll
C:\OpenSSL-Win32\bin
curl-7.58.0\build\Win32\VC15\DLL Debug - DLL OpenSSL
在构建目录中,运行curld.exe
. 如果它运行时没有错误(缺少 dll 等),那么您的构建成功。
我为 Windows 7 rc7100 做了“do_nt.bat”,不要忘记“nmake -f ms\nt.mak install”正确复制标题
谢谢这确实有很大帮助
回应和/或补充上述内容的几个注释。
首先,如果你不想弄乱 ActivePerl,Strawberry Perl非常棒,并且非常适合这个。
其次,如果可能的话,我建议不要使用do_ms .bat,因为根据 INSTALL.W32,我建议使用do_masm ,
这是值得做的,因为它会产生更快的代码:例如,它通常会导致 RSA 例程的 2 倍加速。
此外,构建0.9.8l (L) 的 OpenSSL 是一场噩梦,所以我最终放弃并恢复到0.9.8k,它与 libcurl 1.9 构建和链接(静态)没有问题。