【问题标题】:Using curl in a Windows Universal App在 Windows 通用应用程序中使用 curl
【发布时间】:2016-08-10 08:16:47
【问题描述】:

我想在 Windows 通用应用程序 (x64) 中使用 curl。

我设法让它工作,但我不得不使用一种看起来很老套的解决方法,我想确认它是必要的。

TL;DR - 我必须在 #include <curl\curl.h> 语句之前添加一个 #include <winsock2.h> 语句才能使其工作。我想知道 UWP 是否真的需要它。

我按照 curl 安装指南 here 使用 openssl 构建了 curl。我在 Visual Studio 2015 更新 3 中创建了一个空白的通用应用程序,并添加了 curl 和 openssl 二进制文件并包含在适当的位置。然后在文件顶部添加了#include <curl\curl.h>,得到如下错误:

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 用于 typedef SOCKET curl_socket_t; 中的行 curl.h

curl.h 的顶部,我看到以下预处理器宏阻止包含定义SOCKETwinsock2.h

#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \
      defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H))
/* The check above prevents the winsock2 inclusion if winsock.h already was
   included, since they can't co-exist without problems */
    #include <winsock2.h>
    #include <ws2tcpip.h>
#endif

删除defined(_WINSOCKAPI_) 条件会恢复语句并且一切都可以正常编译,这意味着某处包含winsock.h,而在UWP 上它没有定义SOCKET

确实,查看winsock.h 我可以看到定义SOCKETtypedef 被包裹着

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

这不适用于通用应用程序。

但是,在 winsock2.h 中,SOCKET 有一个等效的 typedef,它不会被预处理器删除。

#include &lt;curl\curl.h&gt; 语句之前添加#include &lt;winsock2.h&gt; 可以使一切正常,但我怀疑这不是解决此问题的最佳方法。

所以我的问题是,这是在 UWP 上使用 curl 的正确方法还是有人找到了更好的解决方案?

谢谢!

【问题讨论】:

    标签: c++ c windows curl uwp


    【解决方案1】:

    通常在 之前包含 应该没有问题。但是你也是对的,它应该在没有它的情况下工作,因为 curl.h 应该在必要时包含该文件。 因为它不是你的情况, _WINSOCKAPI_ 必须在其他地方定义。也许它是在项目设置的预处理器区域中定义的,即它是通过 /D 编译器标志提供的。你已经看过了吗?还要看编译器命令行,就是用来编译你的文件的,有没有定义_WINSOCKAPI_的标志?

    顺便说一句,curl 有条件地包含 的原因如下:Windows 有两个不同的套接字库,winsock 和 winsock2(这是首选)。两者不能共存。 如果您出于某种原因需要使用winsock 而不是winsock2,您可以在 之前包含,它也可以工作。

    【讨论】:

    • 感谢您的帮助。我用 /showincludes 编译了项目,我发现 winsock.h 被 pch.h 隐式包含,这就是 _WINSOCKAPI_ 定义的来源。正如我在问题中提到的,在 UWP 中包含 winsock.h 并不能很好地工作,因为有一条预处理器指令排除了所需的 SOCKET 的 typedef。
    【解决方案2】:

    我确认winsock.h 被包含在以下包含链中:pch.h &gt; collection.h &gt; agile.h &gt; wrl\client.h &gt; unknwn.h &gt; rpc.h &gt; windows.h &gt; winsock.hpch.h 由 Visual Studio 生成,是通用空白应用模板的一部分。

    我的解决方法并不理想,因为这将包含winsock.hwinsock2.h,并且curl.h 中的评论说它们不能共存。

    但是,我确实发现在windows.h 中,包含winsock.h 是用#ifndef WIN32_LEAN_AND_MEAN 包裹的,也就是说,我可以通过添加WIN32_LEAN_AND_MEAN 定义来防止包含winsock.h

    我试了一下,成功地从一个 UWP 应用发出了一个简单的 https 请求。

    总结一下——在 UWP 应用中使用 curl 时,必须添加预处理器定义 WIN32_LEAN_AND_MEAN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      相关资源
      最近更新 更多