Подтвердить что ты не робот

Создание libcurl с поддержкой SSL в Windows

Я использую libcurl в приложении Win32 С++.

У меня есть проект curllib.vcproj, добавленный в мое решение, и заставьте его другие проекты зависеть от него.

Как мне создать его с поддержкой SSL?

4b9b3361

Ответ 1

Ну, так как этот пост плохо сработал, мне пришлось самому разобраться в этом вопросе.

Также ознакомьтесь с другими ответами и комментариями для дополнительной информации о других версиях и т.д.

РЕДАКТИРОВАТЬ: Поскольку я разместил этот Q, кажется, что есть готовые двоичные файлы, доступные на домашней странице curl. Проверьте ответ Джеймса.

Итак, вот:

-

Preprocessor

Следующие два символа должны быть переданы в препроцессор, чтобы включить SSL для libcurl:

USE_SSLEAY
USE_OPENSSL

(libcurl использует поддержку OpenSSL для SSL)

В качестве альтернативы символы могут быть добавлены непосредственно в файл с именем setup.h в libcurl, но я не слишком доволен изменением кода в сторонних дистрибутивах, если только мне это не нужно.

Восстановление библиотеки libcurl, теперь я получил некоторые ошибки в том, что файлы OpenSSL не найдены. Естественно, так как я еще не настроил дистрибутив OpenSSL.

Компиляция двоичных файлов OpenSSL

Я загрузил исходный дистрибутив OpenSSL 0.9.8 и распаковал его.

В корне исходного дистрибутива есть файл INSTALL.W32, который описывает, как скомпилировать двоичные файлы OpenSSL. Цепочка сборки требует perl, поэтому я установил последнюю версию ActivePerl.

У меня были проблемы с сборкой, которые могут быть неприменимы ко всем системам, но я рассмотрю ее здесь, если кто-то испытает то же самое.

В соответствии с INSTALL.W32:

Запустите следующие задачи командной строки с текущим каталогом, установленным в корневой каталог источника:

1> perl Configure VC-WIN32 --prefix=c:/some/openssl/dir

(где "c:/some/openssl/dir" следует заменить на каталог, где должен быть установлен OpenSSL. Не используйте пробелы в этом пути. В этом случае компиляция не будет выполнена)

2> ms\do_ms

Для меня этот шаг был неудачным сначала, так как мне не хватало переменных окружения OSVERSION и TARGETCPU. Я установил их на 5.1.2600 и x86 соответственно. Вы можете получить жалобу о том, что OSVERSION является "безумным", но посмотрите ближе, эта ошибка для WinCE и не влияет на настройку Win32. Чтобы получить версию ОС, запустите команду "ver" из командной строки или запустите winver.exe.

3> nmake -f ms\nt.mak (for static library)

или

3> nmake -f ms\ntdll.mak (for DLL)

Источник теперь компилируется. Приблизительно 5 минут на моем ноутбуке.

Когда компиляция завершена, библиотеки или двоичные файлы были помещены в:

distroot/out32 - для сборки статической библиотеки

или

distroot/out32dll - для сборки DLL

Создание и компоновка

Теперь вернемся к визуальной студии и укажите библиотеки и включите путь для заголовков. Файлы include находятся в distroot/inc32/openssl.

Не забудьте добавить libeay32.lib и ssleay32.lib в качестве вложения компоновщика.

Восстановите проект libcurl.

Ошибка!

Хорошо, по крайней мере, для меня с этой версией OpenSSL. он жаловался на структуру typedef в одном из заголовков OpenSSL. Я не мог найти информацию об этом. Через час поиска в Google я нарушил свой собственный принцип и прокомментировал typedef из заголовка OpenSSL, и, к счастью, libcurl не использовал этот символ, поэтому он прекрасно строился.

Обновление: Как отметил Джейсон, этот вопрос, похоже, исчез с версии 1.0.0a.

Теперь, для подтверждения того, что поддержка SSL включена для libcurl, запустите следующий код:

curl_version_info_data * vinfo = curl_version_info( CURLVERSION_NOW );
if( vinfo->features & CURL_VERSION_SSL )
    // SSL support enabled
else
    // No SSL

Просто как это.

Ответ 2

Возможно, это не тот ответ, который любой ищет, но я просто загрузил предварительно скомпилированные DLL из эту ссылку, найденную в http://curl.haxx.se/download.html

Я проверил тест, который был предложен sharkin, и if( vinfo->features & CURL_VERSION_SSL ) оказался верным.

Ответ 3

При компиляции OpenSSL 1.0.0 в Windows с Visual Studio 2010 он в итоге выбросил ошибку 0x2:

NMAKE: фатальная ошибка U1077: '' C:\Program Files (x86)\Microsoft Visual Studio 10.0 \ VC\BIN\cl.EXE "': код возврата' 0x2 '

Стоп.

Кажется, что эта ошибка будет выбрана из-за флага в файле конфигурации perl, а именно -WX. Как указано в документации MSDN:

Рассматривает все предупреждения компилятора как ошибки. Для нового проекта лучше всего использовать /WX во всех компиляциях; разрешение всех предупреждений обеспечит наименьшее количество труднодоступных дефектов кода.

После удаления -WX-вхождений в файле Configure и повторного ввода команд, указанных здесь, он построил штраф и прошел все тесты.

Ответ 4

Следуя совету Роберта Ошлера, вот мой комментарий к вопросу как ответ:

Вы можете создать недавний libcurl (2012) с собственной поддержкой SSL для Windows, используя символы препроцессора: USE_WINDOWS_SSPI и USE_SCHANNEL вместо OpenSSL.

Ответ 5

\ fatal error C1083: Cannot open include
file: 'stdlib.h': No such file or directory
NMAKE: fatal error U1077::return code 

Эта ошибка может быть решена путем выполнения vcvarsall.bat в Visual Studio.

Ответ 6

я сделал "do_nt.bat" для windows 7 rc7100 не забудьте "nmake -f ms\nt.mak install" правильно скопировать заголовки

спасибо, что это очень помогло

Ответ 7

Пара примечаний в ответ на и/или в дополнение к вышеуказанным..

Во-первых, если вы не хотите общаться с ActivePerl, Strawberry Perl потрясающий и отлично работает для этого.

Во-вторых, вместо использования do_ms.bat, я бы рекомендовал, по возможности, предпочесть do_masm, поскольку, согласно INSTALL.W32,

Это стоит того, потому что это будет приводят к более быстрому коду: например, это как правило, приводят к 2 раза ускорение в процедурах RSA.

Кроме того, построение 0.9.8l (L) OpenSSL было кошмаром, поэтому я в конце концов отказался и вернулся к 0.9.8k, который построил и связал (статически) с libcurl 1.9 без проблем.

Ответ 8

Если вы создаете с помощью Visual Studio IDE и получаете 58 нечетных предупреждений, таких как

"несовместимая связь dll curl_global_init/curl_msnprintf/..."

вы должны добавить CURL_STATICLIB в определения препроцессора.

поэтому вся строка определения должна выглядеть так:

USE_SSLEAY; USE_OPENSSL;. CURL_STATICLIB

При этом все предупреждения исчезнут.

Некоторые будут игнорировать предупреждения и продолжать использовать libs, но затем получат соответствующую * ошибку * s, такую ​​как curl_global_init/curl_msnprintf. Это может быть очень неприятно.

Надеюсь, это поможет кому-то.

Ответ 9

В моем случае следуйте за файлом README для завивки. Моя конфигурация такова:

  • Visual Studio 2015 (VC14)
  • Статическая библиотека
  • Win64
  • curl version 7.57.0
  • OpenSSL 1.0.2

Компиляция libCurl

  • Загрузите исходный код libcurl: https://curl.haxx.se/download.html
  • Раскройте файл и перейдите в папку curl-7.57.0\projects
  • Откройте файл README и следуйте инструкциям, это приведет меня к следующему:
    • Скачан OpenSSL
    • Извлеките его и переименуйте в openssl, отложите в сторону папку curl, это важно, поскольку вы откроете проект VS, который ожидает найти openssl.
    • Установить Perl
    • Выполните утилиту build-openssl.bat для выполнения компиляции openSSL. С моими настройками это стало следующим:
      .\build-openssl.bat vc14 x64 release ..\..\openssl\
      просто запускает .\build-openssl.bat -help, чтобы узнать больше о параметрах.
      После этого вы можете увидеть, что OpenSSL был скомпилирован, поскольку здесь вы получили новую папку: openssl\build\Win64
  • Откройте проект Visual Studio curl-7.57.0\projects\Windows\VC14\curl-all.sln
  • Обязательно установите проект визуальной студии в нужную конфигурацию (LIB Release - LIB OpenSSL в моем случае)
  • Построить все
  • Библиотека находится в curl-7.57.0\build\Win64\VC14\LIB Release - LIB OpenSSL\libcurl.lib

Примечания

  • Не забудьте определить препроцессор CURL_STATICLIB в своем собственном проекте
  • В статической библиотеке вам нужно будет ссылаться на зависимости libcurl, см. этот ответ
  • Возможно, вы не захотите зависеть от LDAP, в этом случае вы можете отключить его, установив препроцессор CURL_DISABLE_LDAP перед компиляцией libcurl.