Сборка libcurl с поддержкой SSL в Windows

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

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

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

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

fa. 01.08.2014 19:09

@fa Возможно, вы захотите опубликовать свой комментарий как полный ответ. Некоторые люди могут пропустить это в разделах комментариев, и это действительно самый простой способ перейти на Windows. Спасибо за совет.

Robert Oschler 07.10.2014 03:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
44
2
48 123
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Что ж, поскольку этот пост потерпел неудачу, мне пришлось самому разобраться в этом вопросе.

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

Обновлено: с тех пор, как я опубликовал этот вопрос, похоже, есть готовые двоичные файлы, доступные с домашней страницы curl. Проверьте Ответ Джеймса.

Итак, вот и:

-

Препроцессор

Следующие два символа необходимо передать препроцессору, чтобы включить 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 минут.

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

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

или же

дистрибутив / out32dll - для сборки DLL

Сборка и связывание

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

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

Перестройте проект libcurl.

Ошибка!

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

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

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

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

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

Спасибо. Жаль, что ребята из libcurl не предоставляют что-то готовое для использования в Windows.

Wartin 09.09.2010 18:57

с openssl-1.0.0.a вам не нужно закомментировать typedef (последний шаг). Просто работает.

Jason Sundram 19.11.2010 00:56

Не могли бы вы обновить свой (потрясающий) ответ, чтобы напомнить людям о необходимости добавить libeay32.lib и ssleay32.lib во вход компоновщика для статических сборок?

Jason Sundram 19.11.2010 00:57

Кроме того, чтобы найти строку версии Windows, просто используйте Пуск | Беги | winver.exe.

Jason Sundram 19.11.2010 00:58

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

fa. 01.08.2014 19:07

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

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

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

Во-первых, если вы не хотите связываться с ActivePerl, Клубничный перл великолепен и отлично подходит для этого.

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

This is worth doing because it will result in faster code: for example it will typically result in a 2 times speedup in the RSA routines.

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

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

NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0 \VC\BIN\cl.EXE"' : return code '0x2'

Stop.

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

Treats all compiler warnings as errors. For a new project, it may be best to use /WX in all compilations; resolving all warnings will ensure the fewest possible hard-to-find code defects.

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

Или можно исправить переопределение, вызвавшее предупреждение. См. Отчет об ошибке на rt.openssl.org/Ticket/…

KTC 21.05.2010 06:09

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

Я провел тест, который предоставил Sharkin, и if ( vinfo->features & CURL_VERSION_SSL ) подтвердился.

красивый! Я предполагаю, что эти корзины были добавлены с тех пор, как я опубликовал Q. Это действительно было то, что я тогда искал.

sharkin 01.03.2011 14:00

Я загрузил упомянутую предварительно скомпилированную dll и добавил libcurl.dll, libeay32.dll и libssl32.dll в качестве дополнительных зависимостей компоновщика, но связывание не удается с ошибкой 1> E: \ curl-7.21.4-ssl-sspi-zlib-static- bin-w32 \ libcurl.dll: фатальная ошибка LNK1107: недопустимый или поврежденный файл: невозможно прочитать на 0x308

Hugh Darling 19.04.2011 14:50

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

"несогласованная связь DLL curl_global_init / curl_msnprintf / ..."

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

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

USE_SSLEAY; USE_OPENSSL; CURL_STATICLIB.

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

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

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

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

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

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

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

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

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

Компиляция libCurl

  1. Загрузите исходный код libcurl отсюда: https://curl.haxx.se/download.html
  2. Распаковать файл и перейти в папку curl-7.57.0\projects
  3. Откройте файл 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
  4. Откройте проект Visual Studio curl-7.57.0\projects\Windows\VC14\curl-all.sln.
  5. Обязательно установите для проекта Visual Studio нужную конфигурацию сборки (в моем случае LIB Release - LIB OpenSSL).
  6. Построить все
  7. Библиотека находится по адресу curl-7.57.0\build\Win64\VC14\LIB Release - LIB OpenSSL\libcurl.lib.

Замечания

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

спасибо, это прекрасно сработало! Одна вещь, которую я хотел бы указать для всех, кто использует это, - обязательно установите для проекта Visual Studio правильную конфигурацию, я случайно выбрал OpenSSL и libSSH2 (facepalm!)

GarCB613 24.01.2018 18:25

Как собрать libcurl C / C++ с OpenSSL (поддержка SSL) в Windows

  1. Установить libcurl
  2. Установить OpenSSl
  3. Создайте libcurl с OpenSSL

Установка libcurl

Перейдите в страница загрузки libcurl и загрузите ZIP-файл в Исходные архивы. В моем случае это называется curl-7.58.0.zip

Распакуйте архив и откройте projects/Windows/VC15/curl_all.sln с помощью Visual Studio.

Установка OpenSSL

Загрузите двоичный файл OpenSSL для Windows. В моем случае я загрузил файл установщика Windows Win32 OpenSSL v1.1.0g из Распространение Shining Light Productions.

Папка установки для меня - C:\OpenSSL-Win32.

Сборка libcurl с OpenSSL

В файле решения curl_all.sln Visual Studio измените конфигурацию сборки на DLL Debug - DLL OpenSSL.

В обозревателе решений щелкните правой кнопкой мыши проект curl и выберите Свойства.

В Linker -> General измените Additional Library Directories и добавьте путь к OpenSSL directory + \lib. В моем случае это C:\OpenSSL-Win32\lib.

Применить и закрыть окно свойств.

Щелкните правой кнопкой мыши проект libcurl и сделайте то же, что и на предыдущем шаге, добавьте OpenSSL directory + \lib в Additional Library Directories в разделе Linker -> General.

В C/C++ -> General добавьте C:\OpenSSL-Win32\include к Additional Include Directories.

Наконец перейдите к Linker -> Input и измените Additional Dependencies. Замените все файлы lib на следующие:

ws2_32.lib
wldap32.lib
openssl.lib
libssl.lib
libcrypto.lib

Применить и закрыть окно свойств.

Не снимая выделения с конфигурации сборки DLL Debug - DLL OpenSSL, перейдите к Build -> Build Solution.

Скопируйте два файла dll libcrypto-1_1.dll и libssl-1_1.dll из каталога bin OpenSSL (C:\OpenSSL-Win32\bin) в только что созданный каталог сборки curl-7.58.0\build\Win32\VC15\DLL Debug - DLL OpenSSL.

Проверка сборки

Внутри каталога сборки запустите curld.exe. Если он работает без ошибок (отсутствует DLL и т. д.), Значит, ваша сборка прошла успешно.

Другие вопросы по теме