web-dev-qa-db-fra.com

Construire libcurl avec le support SSL sur Windows

J'utilise libcurl dans une application Win32 C++.

J'ai le projet curllib.vcproj ajouté à ma solution et défini mes autres projets pour en dépendre.

Comment le créer avec le support SSL activé?

43
sharkin

Eh bien, comme ce message a échoué, j'ai dû creuser moi-même la question.

Consultez également les autres réponses et commentaires pour plus d'informations sur les autres versions, etc.

EDIT: Depuis que j'ai posté ce Q, il semble y avoir des binaires prêts à l'emploi disponibles sur la page d'accueil de curl. Découvrez réponse de James .

Alors voilà:

-

Préprocesseur

Les deux symboles suivants doivent être transmis au préprocesseur pour activer SSL pour libcurl:

USE_SSLEAY
USE_OPENSSL

(libcurl utilise OpenSSL pour le support SSL)

Alternativement, les symboles peuvent être ajoutés directement à un fichier appelé setup.h dans libcurl, mais je ne suis pas trop content de modifier le code dans les distributions tierces, sauf si je le dois vraiment.

En reconstruisant la bibliothèque libcurl, j'ai maintenant des erreurs concernant les fichiers inclus OpenSSL introuvables. Naturellement, puisque je n'ai pas encore correctement configuré la distribution OpenSSL.

Compilation des binaires OpenSSL

J'ai téléchargé la distribution source d'OpenSSL 0.9.8 et l'ai déballée.

À la racine de la distribution source, il y a un fichier appelé INSTALL.W32 qui décrit comment compiler les binaires OpenSSL. La chaîne de construction nécessite Perl, j'ai donc installé la dernière version d'ActivePerl.

J'ai eu quelques problèmes avec la construction, qui pourrait ne pas être applicable à tous les systèmes, mais je vais la parcourir ici au cas où quelqu'un éprouverait la même chose.

Selon INSTALL.W32:

Exécutez les tâches de ligne de commande suivantes avec le répertoire actuel défini sur la racine de distribution source:

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

(Où "c:/some/openssl/dir" doit être remplacé par le répertoire où OpenSSL doit être installé. N'utilisez pas d'espaces dans ce chemin. La compilation plus loin échouera dans ce cas)

2> ms\do_ms

Pour moi, cette étape a échoué au début, car il me manquait les variables d'environnement OSVERSION et TARGETCPU. Je les règle respectivement sur 5.1.2600 et x86. Vous pouvez vous plaindre d'OSVERSION étant "fou", mais regardez de plus près, cette erreur est pour WinCE et n'affecte pas la configuration de Win32. Pour obtenir la version de votre système d'exploitation, exécutez la commande "ver" à partir d'une invite de commande ou exécutez winver.exe.

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

ou

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

La source compile maintenant. A pris environ 5 minutes sur mon ordinateur portable.

Une fois la compilation terminée, les bibliothèques ou les fichiers binaires ont été placés dans:

distroot/out32 - pour la construction d'une bibliothèque statique

ou

distroot/out32dll - pour DLL build

Création et liaison

Maintenant, revenons à Visual Studio et montrez les bibliothèques et incluez le chemin pour les en-têtes. Les fichiers include se trouvent dans distroot/inc32/openssl .

N'oubliez pas d'ajouter libeay32.lib et ssleay32.lib comme entrée de l'éditeur de liens.

Reconstruisez le projet libcurl.

Erreur!

Eh bien au moins pour moi avec cette version d'OpenSSL. il se plaignait d'un struct typedef dans l'un des en-têtes OpenSSL. Je n'ai trouvé aucune information à ce sujet. Après une heure de recherche sur Google, j'ai rompu mon propre principe et commenté le typedef de l'en-tête OpenSSL, et heureusement, libcurl n'utilisait pas ce symbole, donc cela a bien fonctionné.

Mise à jour: Comme l'a souligné Jason, ce problème semble avoir disparu depuis la version 1.0.0a.

Maintenant, pour confirmer que la prise en charge SSL est activée pour libcurl, exécutez le code suivant:

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

Aussi simple que cela.

48
sharkin

Peut-être que ce n'est pas la réponse que quelqu'un cherche, mais je viens de télécharger les DLL précompilées à partir de ce lien trouvé à http://curl.haxx.se/download.html

J'ai exécuté le test fourni par sharkin et if( vinfo->features & CURL_VERSION_SSL ) s'est avéré être vrai.

8
James

Suivant les conseils de Robert Oschler, voici mon commentaire sur la question comme réponse:

Vous pouvez créer une libcurl récente (2012) avec une prise en charge SSL native pour les fenêtres en utilisant les symboles du préprocesseur: USE_WINDOWS_SSPI et USE_SCHANNEL au lieu de ceux d'OpenSSL.

6
fa.

Lors de la compilation d'OpenSSL 1.0.0 sous Windows avec Visual Studio 2010, il a finalement généré une erreur 0x2:

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

Arrêtez.

Il semble que cette erreur sera levée à cause d'un indicateur dans le fichier Perl Configure, à savoir -WX. Comme l'indique la documentation MSDN:

Traite tous les avertissements du compilateur comme des erreurs. Pour un nouveau projet, il peut être préférable d'utiliser/WX dans toutes les compilations; la résolution de tous les avertissements garantira le moins de défauts de code difficiles à trouver.

Après avoir supprimé les occurrences -WX dans le fichier de configuration et ressaisi les commandes indiquées ici il s'est bien construit et a passé tous les tests.

5
GaMer13

Dans mon cas, suivez le curl README était suffisant.
Ma configuration est la suivante:

  • Visual Studio 2015 (VC14)
  • Bibliothèque statique
  • Win64
  • curl version 7.57.0
  • OpenSSL 1.0.2

Compilation de libCurl

  1. Téléchargez la source libcurl ici: https://curl.haxx.se/download.html
  2. Décompressez le fichier et accédez au dossier curl-7.57.0\projects
  3. Ouvrez le fichier README et suivez les instructions, cela m'a amené à faire ce qui suit:
    • Téléchargé OpenSSL
    • Extrayez-le et renommez-le en openssl, mettez-le de côté le dossier curl , ceci est important car vous ouvrirez le projet VS qui attendez-vous à y trouver openssl.
    • Installer Perl
    • Exécutez l'utilitaire build-openssl.bat pour effectuer la compilation de openSSL. Avec mes paramètres, cela est devenu le suivant:
      .\build-openssl.bat vc14 x64 release ..\..\openssl\
      exécute simplement .\build-openssl.bat -help pour en savoir plus sur les paramètres.
      Après cela, vous pouvez voir que OpenSSL a été compilé lorsque vous avez obtenu un nouveau dossier ici: openssl\build\Win64
  4. Ouvrez le projet Visual Studio curl-7.57.0\projects\Windows\VC14\curl-all.sln
  5. Veillez à définir le projet Visual Studio sur la configuration de construction dont vous avez besoin (LIB Release - LIB OpenSSL dans mon cas)
  6. Tout construire
  7. La bibliothèque est située au curl-7.57.0\build\Win64\VC14\LIB Release - LIB OpenSSL\libcurl.lib

Remarques

  • N'oubliez pas de définir le CURL_STATICLIB préprocesseur dans votre propre projet
  • Avec la bibliothèque statique, vous devrez établir des liens avec les dépendances de libcurl, voir cette réponse
  • Vous ne voudrez peut-être pas dépendre de [~ # ~] ldap [~ # ~], dans ce cas, vous pouvez le désactiver en définissant le préprocesseur CURL_DISABLE_LDAP avant vous compilez libcurl.
3
vtellier
\ fatal error C1083: Cannot open include
file: 'stdlib.h': No such file or directory
NMAKE: fatal error U1077::return code 

Cette erreur peut être résolue en exécutant vcvarsall.bat dans Visual Studio.

2
jayaanand

Si vous construisez avec Visual Studio IDE et obtenez 58 avertissements impairs comme

"liaison dll incohérente curl_global_init/curl_msnprintf/..."

vous devez ajouter CURL_STATICLIB aux définitions de préprocesseur.

donc toute la ligne de définition devrait ressembler à:

USE_SSLEAY; USE_OPENSSL; CURL_STATICLIB.

Avec cela, tout l'avertissement disparaîtra.

Certains ignoreraient les avertissements et continueraient à utiliser les bibliothèques, mais obtiendraient alors les * error * s correspondantes comme curl_global_init/curl_msnprintf. Cela peut être très ennuyeux.

J'espère que cela peut aider quelqu'un.

2
Hackle

Quelques notes en réponse et/ou en plus de ce qui précède.

Tout d'abord, si vous ne voulez pas jouer avec ActivePerl, Strawberry Perl est formidable et a parfaitement fonctionné pour cela.

Deuxièmement, au lieu d'utiliser do_ms . Bat, je recommanderais de préférer do_masm si possible car, selon INSTALL.W32,

Cela vaut la peine car cela entraînera un code plus rapide: par exemple, cela entraînera généralement une accélération de 2 fois dans les routines RSA.

Aussi, construire 0.9.8l (L) d'OpenSSL était un cauchemar donc j'ai finalement abandonné et suis revenu à 0.9.8k qui a construit et lié (statiquement) avec libcurl 1.9 sans problème.

1
hemp

Comment construire libcurl C/C++ avec OpenSSL (prise en charge SSL) sous Windows

  1. Installez libcurl
  2. Installer OpenSSl
  3. Créer libcurl avec OpenSSL

Installation de libcurl

Accédez à la page de téléchargement de libcurl et téléchargez le fichier Zip sous Archives sources . Dans mon cas, il s'appelle curl-7.58.0.Zip

Extrayez l'archive et ouvrez projects/Windows/VC15/curl_all.sln avec Visual Studio.

Installation d'OpenSSL

Téléchargez le binaire Windows d'OpenSSL. Dans mon cas, j'ai téléchargé le fichier d'installation de Windows Win32 OpenSSL v1.1.0g de la distribution Shining Light Productions .

Le dossier d'installation pour moi est C:\OpenSSL-Win32.

Construire libcurl avec OpenSSL

Dans le curl_all.sln Fichier de solution Visual Studio, changez la configuration de build en DLL Debug - DLL OpenSSL.

Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le projet curl et accédez à Propriétés.

Sous Linker -> General modifier Additional Library Directories et ajoutez le chemin d'accès à votre OpenSSL directory + \lib. Dans mon cas, c'est C:\OpenSSL-Win32\lib.

Appliquez et fermez la fenêtre des propriétés.

Cliquez avec le bouton droit sur le projet libcurl et faites la même chose que l'étape précédente, ajoutez OpenSSL directory + \lib à Additional Library Directories sous Linker -> General.

Sous C/C++ -> General, ajouter C:\OpenSSL-Win32\include à la Additional Include Directories.

Allez enfin à Linker -> Input et modifier Additional Dependencies. Remplacez tous les fichiers lib par ce qui suit:

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

Appliquez et fermez la fenêtre des propriétés.

Avec le DLL Debug - DLL OpenSSL configuration de build toujours sélectionnée, allez à Build -> Build Solution.

Copiez les deux fichiers dll libcrypto-1_1.dll et libssl-1_1.dll depuis le répertoire bin d'OpenSSL (C:\OpenSSL-Win32\bin) dans le répertoire de construction que vous venez de créer curl-7.58.0\build\Win32\VC15\DLL Debug - DLL OpenSSL.

Validation de la construction

Dans le répertoire de construction, exécutez curld.exe. S'il s'exécute sans erreur (dll manquante, etc.), votre génération a réussi.

1
Acidic9