在Windows通用应用程序中使用curl

Using curl in a Windows Universal App

本文关键字:curl 应用程序 Windows      更新时间:2023-10-16

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

我设法让它工作,但我不得不使用一个变通方法,似乎黑客,我想确认它是必要的。

TL;DR—我必须在#include <curlcurl.h>语句之前添加#include <winsock2.h>语句,以使其工作。我想知道它在UWP上是否真的需要。

我按照这里的curl安装指南使用openssl构建了curl。我在Visual Studio 2015 update 3中创建了一个空白的通用应用程序,并在适当的地方添加了curl和openssl二进制文件。然后在文件的顶部添加一个#include <curlcurl.h>,得到以下错误:

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

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 <curlcurl.h>语句之前添加#include <winsock2.h>使一切工作,但我怀疑这不是解决这个问题的最佳方法。

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

谢谢!

一般来说,包含之前& lt;旋度/curl.h>。但是您也正确地认为没有这个文件也可以工作,因为curl.h应该在必要时包含该文件。因为在您的情况下没有定义,所以必须在其他地方定义_WINSOCKAPI_。也许它是在项目设置的预处理器区域中定义的,即它是通过/D编译器标志提供的。你已经看过了吗?还要查看编译器命令行,用于编译文件,是否有定义_WINSOCKAPI_的标志?

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

我确认winsock.h被包含在以下包含链中:pch.h > collection.h > agile.h > wrlclient.h > unknwn.h > rpc.h > windows.h > 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 .