c++ - 在 Windows 通用应用程序中使用 curl

标签 c++ c windows curl uwp

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

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

TL;DR - 我必须添加 #include <winsock2.h> #include <curl\curl.h> 之前的声明声明,让它工作。我想知道 UWP 是否真的需要它。

我按照 curl 安装指南使用 openssl 构建了 curl here .我在 Visual Studio 2015 update 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 的顶部我看到以下预处理器宏阻止包含 winsock2.h它定义了 SOCKET :

#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我可以看到 typedef它定义了 SOCKET包裹着

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

不适用于通用应用。

然而,在winsock2.h有一个等效的 typedef对于 SOCKET不会被预处理器丢弃。

添加#include <winsock2.h>#include <curl\curl.h> 之前声明使一切正常,但我怀疑这不是解决此问题的最佳方法。

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

谢谢!

最佳答案

一般在之前包含应该没有问题。但是你也说得对,没有它也应该可以工作,因为 curl.h 应该在必要时包含该文件。 由于您的情况并非如此,因此 _WINSOCKAPI_ 必须在其他地方定义。也许它是在项目设置的预处理器区域中定义的,即它是通过/D 编译器标志提供的。你已经看过了吗?还要查看用于编译文件的编译器命令行,是否有定义 _WINSOCKAPI_ 的标志?

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

关于c++ - 在 Windows 通用应用程序中使用 curl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38867778/

相关文章:

c - 为什么没有 lpthread 标志的 gcc 链接?

c++ - QtWebkit 作为桌面应用程序 GUI

html - 通过html链接将参数传递给程序

windows - 如何在 Vim 的每个拆分窗口的状态行中显示当前文件名?

c++ - 调用封闭结构的成员函数

C++ - 如何找出当前线程的创建位置?

c++ - 如何获取 QTableWidget 列的标签值

c - 尝试从 char*[] 复制所有字符串但出现段错误

C - 动态数组中的排序不适用于特定数量的值

c++ - OpenCV imencode pgm 没有编码正确的格式