2016-08-10 5 views
2

Я хочу использовать завиток в 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 или кто-нибудь нашел лучшее решение?

Спасибо!

ответ

0

Я подтвердил, что winsock.h относится к следующей цепочке: pch.h > collection.h > agile.h > wrl\client.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, то есть, можно предотвратить winsock.h от быть включен путем добавления WIN32_LEAN_AND_MEAN определить.

Я попробовал и успешно выпустил простой запрос https из приложения UWP.

Итак, чтобы суммировать - при использовании curl в приложении UWP вы должны добавить определение препроцессора WIN32_LEAN_AND_MEAN.

0

В общем случае не должно быть проблем с включением <winsock2.h> до <curl/curl.h>. Но вы также правы, что он должен работать без этого, потому что curl.h должен включать этот файл, если это необходимо. Как и в вашем случае, _WINSOCKAPI_ должен быть определен где-то в другом месте. Возможно, он определен в области препроцессора настроек проекта, то есть он предоставляется через флаг компилятора/D. Вы уже видели там? Также посмотрите на командную строку компилятора, которая используется для компиляции вашего файла, есть ли флаг, определяющий _WINSOCKAPI_?

BTW, причина, по которой curl включает в себя <winsock2.h> условно выглядит следующим образом: Windows имеет две разные библиотеки сокетов, winsock и winsock2 (что предпочтительнее). Оба они не могут сосуществовать друг с другом. Если вам нужно использовать winsock вместо winsock2, по какой-то причине вы можете включить <winsock.h> до <curl/curl.h>, и он также будет работать.

+0

Спасибо за помощь. Я скомпилировал проект с/showincludes, и я обнаружил, что 'winsock.h' включается неявно с помощью pch.h, и именно здесь происходит определение' _WINSOCKAPI_'. Как я уже упоминал в своем вопросе, включение «winsock.h» в UWP не очень хорошо, потому что есть инструкция препроцессора, которая исключает необходимый typedef «SOCKET». – galsh83

Смежные вопросы