【发布时间】: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 的顶部,我看到以下预处理器宏阻止包含定义SOCKET 的winsock2.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 我可以看到定义SOCKET 的typedef 被包裹着
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
这不适用于通用应用程序。
但是,在 winsock2.h 中,SOCKET 有一个等效的 typedef,它不会被预处理器删除。
在#include <curl\curl.h> 语句之前添加#include <winsock2.h> 可以使一切正常,但我怀疑这不是解决此问题的最佳方法。
所以我的问题是,这是在 UWP 上使用 curl 的正确方法还是有人找到了更好的解决方案?
谢谢!
【问题讨论】: