Signaler

Utiliser libcurl sur Code::Blocks

Posez votre question antheor19 10Messages postés mardi 10 octobre 2017Date d'inscription 13 octobre 2017 Dernière intervention - Dernière réponse le 16 oct. 2017 à 10:14 par [Dal]
Bonjour,
Je développe un programme en c++ qui nécessite l'envoie d'email. Pour cela j'ai choisi d'utiliser la libcurl. Je précise que je suis sous Windows et que je code avec Code::Blocks.
Mais voilà j'implémente le code suivant : https://raw.githubusercontent.com/curl/curl/master/docs/examples/smtp-mail.c
je télécharge sur https://curl.haxx.se/download.html la version curl-7.56.0-win64-mingw.7z, je dézip le tout, je link la lib (dans le Search directories j'ajoute le dossier include du zip, et dans le linker settings j'ajoute les 2 .a contenu dans le répertoire lib du zip), je compile et paf undefined reference to `_imp__curl_easy_init'.
J'en déduis que mon le lien avec la libcurl n'à pas fonctionné pourtant je pense avoir tout bien fait.

Quelqu'un pourrait-il m'aider svp?
Utile
+0
plus moins
Bonsoir antheor19,

Oui, suit ces instructions : http://www.commentcamarche.net/faq/35736-installer-sous-codeblocks-avec-mingw-une-bibliotheque-librairie-compilee qui prennent justement comme exemple libcurl


Dal
[Dal] 4424Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 16 octobre 2017 Dernière intervention - 12 oct. 2017 à 19:10
1.

Le OpenSSL que tu dois récupérer doit être compilé pour MinGW (donc pour Windows) et en 64 bits, ce que tu as téléchargé (là https://indy.fulgan.com/SSL/ je pense) a l'air d'être un binaire Mach-O.

Installe plutôt de cette source https://slproweb.com/products/Win32OpenSSL.html un package "Win64 OpenSSL v1.0.2L", la version 1.0.2 de OpenSSl étant celle indiquée aussi par le Makefile.

2.

Pour répondre à ta question sur Makefile.m32.

Ce fichier contient les instructions destinées à make, qui est l'outil de ligne de commande utilisé sur Linux et systèmes de ce type, pour lancer une compilation selon la "recette" décrite dans un fichier "Makefile". Cette "recette" contient les informations nécessaires pour générer, à partir des sources, un ou plusieurs exécutables, et notamment les paramètres passés par make au compilateur et au linker.

Ce fichier est donc compréhensible par make (tu pourrais utiliser le make de MinGW pour compiler, qui devrait s'appeler mingw32-make.exe, sans passer par Code::blocks, sous réserve de disposer des bibliothèques et de changer les premières lignes pour indiquer où elles sont), MinGW ayant pour vocation de porter sous Windows la chaîne de compilation GNU dont make fait partie.

Bref, tu ne peux pas le rajouter tel quel à ton projet Code::blocks (qui n'utilise pas un Makefile, mais un fichier de projet au format .cbp), mais ce qu'il contient te renseigne sur les options utilisables pour compiler les dépendances.

3.

Quand tu dois gérer des dépendances, comme ici OpenSSL, il faut normalement que tu ailles chercher l'information dans la documentation de la bibliothèque concernée (ici celle du projet OpenSSL) pour savoir comment les utiliser, quelles options passer au compilateur et au linker selon ce que tu veux faire.

Ma suggestion est de tenter de tirer de Makefile.m32 cette information, puisqu'il est sensé compiler les programmes d'exemple (mais tu peux aller piocher dans la doc d'OpenSSL si tu préfères, c'est un bon exercice :-P).

Dans ton cas, comme information utile tirée du passage que j'ai cité :

a) pour lier statiquement la dépendance d'OpenSSL, tu passerais : -lssl -lcrypto -lgdi32 -lcrypt32 -DUSE_OPENSSL

-lssl signifie que le compilateur cherchera le fichier "libssl.a", etc.

libssl.a et libcrypto.a devraient se trouver dans les binaires MinGW d'OpenSSL dont il faudra indiquer l'emplacement

libgdi32.a et libcrypt32.a sont fournis par MinGW, tu n'auras pas à en indiquer l'emplacement, ni à les rechercher

b) pour lier dynamiquement : -lssl32 -leay32 -DUSE_OPENSSL

libssl32.a et libeay32.a devraient se trouver dans les binaires MinGW d'OpenSSL dont il faudra indiquer l'emplacement

Est-ce plus clair ?

4.

Utiliser OpenSSL n'est jamais simple. Je suppose que tu en as besoin pour gérer l'authentification SMTP par SSL ou TLS...

Bienvenue à l'enfer des dépendances :-)

Pour des projets libcurl ne nécessitant pas autre chose que libcurl elle-même, utiliser libcurl est vraiment simple et tu es déjà en mesure de le faire... là c'est OpenSSL qui te prend la tête désormais.

Dal
Répondre
antheor19 10Messages postés mardi 10 octobre 2017Date d'inscription 13 octobre 2017 Dernière intervention - 12 oct. 2017 à 20:42
Merci beaucoup pour tout ce temps que tu m'accorde c'est vraiment sympas.

J'ai téléchargé Win64 OpenSSL v1.0.2L depuis le lien, mais je trouve aucun des .a que tu m'a énoncé. J'ai bien libssl32 et libeay32 mais en .dll ^^° j'ai beau regardé dans /bin et faire une recherche sur tout le répertoire OpenSSl ils n'y sont pas.
J'ai pourtant normalement téléchargé le bon fichier.

Ah il faut s'accroché pour envoyer des mail en c++ ^^
Répondre
[Dal] 4424Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 16 octobre 2017 Dernière intervention - 13 oct. 2017 à 10:56
J'ai pu télécharger les différents types de fichiers proposés sur les différents liens signalés sur le wiki d'OpenSSL pour les inspecter.

Ils ne semblent contenir de binaires que pour une compilation avec liaison dynamique, et pas statique.

1.

Si tu veux vraiment inclure les dépendances nécessaires d'OpenSSL sous forme statique dans ton programme sans les compiler toi même, il va falloir que tu trouves d'autres sources.

C'est un peu une aiguille dans une meule de foin car tes exigences sont : compilation pour MinGW, en 64 bits et statique, ce qui fait pas mal de critères cumulés.

J'ai trouvé hier soir un gars qui proposait ses fichiers sur son blog après avoir compilé pour ses besoins, mais pour une version d'OpenSSL ancienne (1.0.0 de mémoire), ce qui n'est pas très recommandé pour un produit de sécurité. De plus, ce n'est pas sûr que cela fonctionne bien avec libcurl, qui attend peut-être des API différentes sur des versions actuelles.

Sous Linux, les bibliothèques et leurs dépendances sont disponibles sous forme de paquets et installables avec les gestionnaires de paquets de chaque distribution.

D'ailleurs, certaines distributions Linux proposent des paquets de binaires de la bibliothèque statique OpenSSL pour cross-compilation sur MingW w64 : https://centos.pkgs.org/7/epel-x86_64/mingw64-openssl-static-1.0.2h-1.el7.noarch.rpm.html dont tu pourrais extraire les fichiers libcrypto.a et libssl.a pour essayer de les utiliser. Je n'ai jamais essayé une telle chose, mais en théorie, cela pourrait fonctionner. Note que selon ce paquet CentOS, ce paquet ne contient que libcrypto.a et libssl.a et dépend de celui-là, qui contient d'autres binaires et les entêtes à mettre en include. Sous Windows, un programme de compression comme 7-Zip permet d'ouvrir et extraire le contenu de fichiers .rpm.

Sinon, sous Windows, dans ce type de cas, on en est souvent réduits à devoir compiler soi même les dépendances :-)

2.

Une autre option est que tu compiles avec liaison dynamique pour OpenSSL. Ce ne sont que deux .dll à te trimbaler avec l'exécutable, et tu les as déjà, ainsi que les libssl32.a et libeay32.a à passer aux options de compilation (
-lssl32 -leay32 -DUSE_OPENSSL
en plus des options libcurl).

Dal
Répondre
antheor19 10Messages postés mardi 10 octobre 2017Date d'inscription 13 octobre 2017 Dernière intervention - 13 oct. 2017 à 17:34
Merci beaucoup pour ton aide tu m'a appris beaucoup de choses. Je comprends bien que faire du statique avec un mélange de MinGw, OpenSSL en 64bit devient une galère monstrueuse, et avoir plusieurs fichiers pour exécuter mon projet m'embête un petit peu ^^°.
Je pense que peut être le plus judicieux est de partir vers une autre solution : http://fvirtman.free.fr/recueil/01_05_02_mail.c.php cet exemple sera peut être beaucoup moins contraignant que ma solution avec Curl.

J'avais essayé un code similaire au départ mais j'avais eu un problème à cause du
#pragma comment(lib,"ws2_32.lib")
. De ce que j'ai compris Code::Blocks sous windows n'aime pas trop ça ^^ Mais vu ce que vu ce que tu m'a appris si je rajoute -lws2_32 dans les linker options c'est équivalent et je peux supprimer le pragma, c'est bien ça?
Répondre
[Dal] 4424Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 16 octobre 2017 Dernière intervention - 16 oct. 2017 à 10:14
Salut,

Le source en question est pour Visual Studio, tu peux retirer la directive pragma pour MinGW.

ws2_32.lib est une bibliothèque "Winsocks" de Microsoft (Windows Sockets 2). Le code est bizarre, car le include inclue winsocks.h et pas winsock2.h... Bref.. si c'est bien ws2_32.lib que tu dois utiliser, en principe, tu devrais avoir l'équivalent MinGW
libws2_32.a
dans ton répertoire MinGW/lib (vois par toi même) et la compilation devrait effectivement se faire en ajoutant
-lws2_32
.

Pour autant, cette liaison ne sera pas statique, et pour fonctionner, tu auras besoin d'un système Windows avec
ws2_32.dll
installé sur le système (
libws2_32.a
pour MinGW, comme
ws2_32.lib
pour Visual Studio, permet juste d'utiliser les symboles présents dans cette .dll). Ton code ne sera pas portable sur des systèmes non Windows, ou les systèmes Windows non dotés de cette .dll.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms740506%28v=vs.85%29.aspx

Si cela te convient, et que c'est moins compliqué pour toi, tant mieux :-)

Cela dit, le code dont tu fournis le lien ne gère pas l'authentification à un serveur SMTP, et tu ne pourras pas envoyer d'e-mail à un serveur exigeant une session SSL ou TLS. Je ne suis pas sûr de comment cela est géré avec des bibliothèques Windows.

libcurl gère SSL et TLS avec OpenSSL.

Ce qui est bizarre, c'est que tu dis utiliser le code d'exemple https://curl.haxx.se/libcurl/c/smtp-mail.html qui ne comporte pas de tentatives de passage en SSL ou TLS (c'est plutôt https://curl.haxx.se/libcurl/c/smtp-tls.html par exemple) et qu'à l'exécution cette dépendance soit tout de même exigée.

As-tu essayé de récupérer les fichiers libcrypto.a et libssl.a des paquets MinGW 64 de CentOS ?


Dal
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !