Создание libcurl с поддержкой SSL в Windows
Вопрос
Я использую libcurl в приложении Win32 на C ++.
У меня есть проект curllib.vcproj, добавленный в мое решение, и я настроил другие мои проекты так, чтобы они зависели от него.
Как мне создать его с включенной поддержкой SSL?
Решение
Что ж, поскольку этот пост сильно провалился, мне пришлось копаться в этом вопросе самому.
Также ознакомьтесь с другими ответами и комментариями для получения дополнительной информации о других версиях и т.д.
Редактировать:С тех пор как я опубликовал этот вопрос, похоже, что с домашней страницы 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
Построение и увязка
Теперь вернемся к visual Studio и укажем библиотеки и включим путь к заголовкам.Включаемые файлы находятся в дистрибутив/inc32/openssl.
Не забудьте добавить libeay32.библиотека и ssleay32.библиотека в качестве входных данных компоновщика.
Перестройте проект 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
Все очень просто.
Другие советы
Возможно, это не тот ответ, который кто-то ищет, но я просто скачал предварительно скомпилированные библиотеки DLL из эта ссылка находится по адресу http://curl.haxx.se/download.html
Я выполнил тест, предоставленный Sharkin, и if (vinfo-> gt; features & amp; CURL_VERSION_SSL)
подтвердилось.
Следуя совету Роберта Ошлера, вот мой комментарий на вопрос в качестве ответа:
Вы можете собрать недавний libcurl (2012) с собственной поддержкой SSL для окон, используя символы препроцессора: USE_WINDOWS_SSPI и USE_SCHANNEL вместо OpenSSL. Р>
При компиляции OpenSSL 1.0.0 в Windows с Visual Studio 2010 в конечном итоге была выдана ошибка 0x2:
ПРИГОТОВЛЕНИЕ :неустранимая ошибка U1077:'"C:\Program Файлы (x86)\Microsoft Visual Studio 10.0 \VC\BIN\cl.EXE"' :код возврата "0x2"
Остановка.
Похоже, что эта ошибка будет выдана из-за флага в файле конфигурации perl, а именно -WX.Как указано в документации MSDN:
Рассматривает все предупреждения компилятора как ошибки.Для нового проекта, возможно, лучше всего использовать /WX во всех компиляциях;устранение всех предупреждений обеспечит как можно меньше трудноопределимых дефектов кода.
После удаления вхождений -WX в файле конфигурации и повторного ввода указанных команд здесь он был собран нормально и прошел все тесты.
В моем случае было достаточно следовать файлу curl README.
Моя конфигурация следующая:
- Visual Studio 2015 (VC14)
- Статическая библиотека
- Win64
- версия curl 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
- Обязательно установите для проекта Visual Studio необходимую конфигурацию сборки (
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.
Если вы создаете с помощью Visual Studio IDE и получаете 58 нечетных предупреждений, подобных
"несогласованная ссылка dll curl_global_init / curl_msnprintf /..."
вам следует добавить CURL_STATICLIB к определениям препроцессора.
таким образом, вся строка определения должна выглядеть следующим образом:
USE_SSLEY;USE_OPENSSL;CURL_STATICLIB.
При этом все предупреждения исчезнут.
Некоторые проигнорировали бы предупреждения и продолжили бы использовать библиотеки, но затем получили бы соответствующие * error * ы, подобные 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.
я сделал " do_nt.bat " для windows 7 rc7100 не забудьте " nmake -f ms \ nt.mak установить " правильно скопировать заголовки
спасибо, это очень помогло
Пара заметок в ответ и / или в дополнение к вышесказанному.
Во-первых, если вы не хотите связываться с ActivePerl, Strawberry Perl потрясающий и отлично сработал для этого.
Во-вторых, вместо использования do_ms .bat, я бы рекомендовал, если это возможно, предпочесть do_masm , поскольку, согласно INSTALL.W32,
Это стоит сделать, потому что это будет привести к более быстрому коду: например будет обычно в 2 раза ускорение в процедурах RSA.
Кроме того, сборка 0.9.8l (L) OpenSSL была кошмаром, поэтому я в конце концов сдался и вернулся к 0.9.8k , который собирал и статически связывал с libcurl 1.9 без проблем.
Как собрать libcurl C / C ++ с OpenSSL (поддержка SSL) в Windows
<Ол>Установка libcurl
Перейдите на страницу загрузки libcurl и загрузите ZIP-файл в разделе Source Архивы . В моем случае это называется curl-7.58.0. застежка-молния код>
Извлеките архив и откройте projects / Windows / VC15 / curl_all.sln
в Visual Studio.
Установка OpenSSL
Загрузите бинарный файл Windows OpenSSL. В моем случае я загрузил файл установщика 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 - > Общие
измените Дополнительные каталоги библиотек
и добавьте путь к вашему каталогу OpenSSL + \ lib
. В моем случае это C: \ OpenSSL-Win32 \ lib
.
Применить и закрыть окно свойств.
Щелкните правой кнопкой мыши проект libcurl
и сделайте то же, что и на предыдущем шаге, добавьте каталог OpenSSL + \ lib
в дополнительные каталоги библиотек
в разделе < code> Linker - > Общие код>.
В разделе C / C ++ - > Общие
, добавьте C: \ OpenSSL-Win32 \ include
в Дополнительные каталоги включения
.
Наконец, перейдите к Linker - > Введите
и измените Дополнительные зависимости
. Замените все файлы lib на следующие:
ws2_32.lib
wldap32.lib
openssl.lib
libssl.lib
libcrypto.lib
Применить и закрыть окно свойств.
Если конфигурация сборки DLL Debug - DLL OpenSSL
еще выбрана, перейдите в раздел Build - > Построить решение
.
Скопируйте два файла 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 и т. Д.), Значит, ваша сборка прошла успешно.