Utiliser libcurl sur Code::Blocks [Résolu]

antheor19 12 Messages postés mardi 10 octobre 2017Date d'inscription 21 novembre 2017 Dernière intervention - 10 oct. 2017 à 20:40 - Dernière réponse : antheor19 12 Messages postés mardi 10 octobre 2017Date d'inscription 21 novembre 2017 Dernière intervention
- 15 nov. 2017 à 09:50
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?
Afficher la suite 
12Messages postés mardi 10 octobre 2017Date d'inscription 21 novembre 2017 Dernière intervention

20 réponses

Répondre au sujet
[Dal] 4466 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 29 novembre 2017 Dernière intervention - 11 oct. 2017 à 00:02
0
Utile
18
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] 4466 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 29 novembre 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
antheor19 12 Messages postés mardi 10 octobre 2017Date d'inscription 21 novembre 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?
[Dal] 4466 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 29 novembre 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
antheor19 > [Dal] 4466 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 29 novembre 2017 Dernière intervention - 13 nov. 2017 à 20:13
Salut,
Je suis vraiment désolé de ne pas avoir répondu plus tôt mais j'ai été inondé d'autres projets ainsi que d'examens qui passent avant mes projets persos.

Je suis aussi perplexe par rapport au problème de connexion SSL dans le code curl, peut être est-ce lié à des dépendances ...

J'ai installé depuis la dernière fois fedora sur mon ordi peut être que je pourrais résoudre de ce fait le problème des fichiers libcrypto.a et libssl.a.

Le soucis de mon code actuel est qu'il m'est nécessaire de passé par le serveur SMTP du fournisseur d'accès internet de l'utilisateur, sans pouvoir le connaître au préalable. Donc je les testes tous c'est pas propre et je n'ai pas les moyens de tester si cela marche pour tous les opérateurs.....

Sinon j'ai pensé que je pourrais peut être utiliser pour envoyer les données le protocole ftp, le soucis c'est qu'il me faut un hébergeur pour récupérer les données. Du coup je voudrais avoir ton avis sur ce qu'il vaut mieux que je fasse.

Antheor19.
[Dal] 4466 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 29 novembre 2017 Dernière intervention - 15 nov. 2017 à 09:36
pas de problème Anthéor19 :-)

Il est bizarre ton programme. Normalement, si un programme envoie des informations vers l'extérieur, l'utilisateur est sensé être informé. Si, de plus, on veut utiliser le serveur SMTP de l'utilisateur, le minimum c'est qu'il le sache, et lui laisser le soin de paramétrer le serveur de son choix, selon les options de son choix. Utiliser ton propre serveur SMTP est une autre possibilité, mais cela pose d'autres problèmes en termes de sécurité.

Bref... de nos jours, lorsqu'un programme a besoin d'envoyer des données, il le fait le plus souvent vers un Web-service, donc vers un site Web.

libcurl peut gérer des requêtes HTTP GET ou POST et faire cela du côté client (ton programme).

A l'autre bout, cela nécessite un serveur Web, et d'implémenter les pages recevant les requêtes dans un langage de script (par exemple PHP). Ensuite, le script recevant les informations sur le serveur Web peut stocker ces informations dans des fichiers, ou dans une base de données comme MySQL ou PostgreSQL.

Bon courage pour la suite de ton projet :-)

Dal
Commenter la réponse de [Dal]
antheor19 12 Messages postés mardi 10 octobre 2017Date d'inscription 21 novembre 2017 Dernière intervention - 15 nov. 2017 à 09:50
0
Utile
Merci beaucoup pour toute ton aide tu m'as appris beaucoup de chose. Je vais me lancer dans les requêtes get /post http j'aurais dû y penser plutôt.

Encore un grand merci.

Antheor19
Commenter la réponse de antheor19