Я хочу использовать завиток в Windows Universal App (x64).Использование curl в Windows Universal App
Мне удалось заставить его работать, но мне пришлось использовать обходное решение, которое кажется хакерским, и я хочу подтвердить, что это необходимо.
TL; DR - я должен был добавить #include <winsock2.h>
заявления перед #include <curl\curl.h>
заявлением, чтобы заставить его работать. Я хочу знать, действительно ли это необходимо для UWP.
Я построил завиток с помощью openssl, следуя инструкциям по установке локонов here. Я создал пустое универсальное приложение в обновлении версии 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
я увидел, что следующие макросы препроцессора предотвратить включение 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 или кто-нибудь нашел лучшее решение?
Спасибо!
Спасибо за помощь. Я скомпилировал проект с/showincludes, и я обнаружил, что 'winsock.h' включается неявно с помощью pch.h, и именно здесь происходит определение' _WINSOCKAPI_'. Как я уже упоминал в своем вопросе, включение «winsock.h» в UWP не очень хорошо, потому что есть инструкция препроцессора, которая исключает необходимый typedef «SOCKET». – galsh83