在Windows通用应用程序中使用curl
Using curl in a Windows Universal App
我想在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
的顶部,我看到以下预处理器宏阻止包含定义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 <curlcurl.h>
语句之前添加#include <winsock2.h>
使一切工作,但我怀疑这不是解决这个问题的最佳方法。
所以我的问题是,这是在UWP上使用curl的正确方法吗?还是有人找到了更好的解决方案?
谢谢!
一般来说,包含
顺便说一句,curl包含
我确认winsock.h
被包含在以下包含链中:pch.h > collection.h > agile.h > wrlclient.h > unknwn.h > rpc.h > windows.h > winsock.h
。pch.h
是由Visual Studio生成的,是通用空白应用程序模板的一部分。
我的解决方案并不理想,因为这将使winsock.h
和winsock2.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
.
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 在winc++应用程序中使用curl
- 在Windows通用应用程序中使用curl