|Résolu| [C] Impossible de compiler, mauvaise install de la libraire ?
Forum Programmation : |Résolu| [C] Impossible de compiler, mauvaise install de la libraire ?
Bonjour à tous !
J'ai téléchagé et installé la librairie "curl" (tu te souviens CRicky ;-) ?) mais ça foire à la compilation... :-?
Voilà la démarche que j'ai suivie :
J'utilise l'IDE CodeBlocks,
Je vais dans C:\Program Files\CodeBlocks\mingw32 et je met les headers dans include\curl et je met les fichiers .a, la dll et le fichier .la dans le dossier CodeBlocks\mingw32\lib et le fichier curl-config dans CodeBlocks\mingw32\bin.
Mon code :
Code :
|
Le message d'erreur :
| Citation :
|
Vous pouvez m'aider ?
Si tu es sûr de lier avec la bonne lib, c'est que la signature de la fonction dans la lib ne correspond pas à celle qui est dans ton programme.
Ce qui définit la signature c'est la déclaration du prototype.
J'ai downloadé les source, j'a regardé easy.h, j'y ai vu ceci:
Code :
|
Il faut voir où sont définies ces constantes, c'est dans curl.h (c'est toujours comme ça :-D ):
Code :
|
Toi, quand tu compiles, le lieur cherche la signature
_imp__curl_easy_init donc une fonction d'import ce qui a l'air correct puisque tu veux utiliser la lib.
Maintenant, il faut voir si la lib est correcte. As-tu compilé la lib (si c'est toi qui l'a compilé) avec la constante BUILDING_LIBCURL definie et CURL_STATICLIB non définie ?
| Citation :
|
Non, je n'ai pas compiler la libraire, j'ai télécharger la version de développement.
Je te suis pas totalement là... :-?
Pourquoi cette fonction d'import foire-t-elle ?
Dans le .h, il y a le prototype de fonction qui permet d'écrire la signature de fonction dans les fichiers compilés.
Les signatures de fonctions c'est le texte "_imp__curl_easy_init" qui sert de label pour faire le lien entre les objets compilés pour générer le fichier exécutable.
Quand tu compile une lib, tu dois mettre une signature d'exportation qui indique au compilateur que la fonction est écrite dans cet objet binaire et qu'il est utilisable de l'extérieur.
Pour utiliser une lib, il faut aussi une signature, mais il on la mettait aussi en export, le compilateur croirait que c'est cet objet qui contient le code, or c'est la librairie qui la contient. tu dois donc utiliser une signature d'import pour indiquer au compilo que cet objet ne contient pas le code mais est ailleurs.
Bref, que ce soit pour compiler la lib ou pour compiler ton source, le même fichier .h est utilisé. Il faut 2 signature différente selon le cas où on veut utiliser la fonction (ton programme) et le cas où c'est pour rendre visible la fonction de l'extérieur (compilation de la lib).
l'import/export c'est pour utiliser du code dans une librairie (un fichier .dll) séparé: le code de la fonction est dans la dll et pas le programme.
Il y a une autre façon de compiler une lib, c'est la compilation d'une lib statique. La différence est que le compilateur prend le code de la lib et la copie dans l'exécutable (le .dll est intégré dans le .exe, et le .dll devient inutile)
Si la lib que tu as récupérée est comilée en mode statique, il faut que tu définisse la constante "#define CURL_STATICLIB" pour que les signatures correspondent.
Tu peux aussi recompiler toi-même la lib en utilisant la contante d'export "#define BUILDING_LIBCURL"
J'ai mis "#define CURL_STATICLIB" dans curl.h et la compilation foire toujours...
C'est bien ça qui fallait faire ?
non ajoute à ta compilation le define comme ça, t'es sûr que c'est défini partout. (-D CURL_STATICLIB)
sous Dev-C++, à ajouter dans options projet, parametres, compilateur et compilateur C++
essaie avec l'autre define on sait jamais :-D
Si ça ne marche toujours pas, montre le contenu du fichier Makefile (Makefile.win sous windows) en masquant les paths si tu veux. Comme ça, on verra ce qui est compilé et lié.
| Citation : non ajoute à ta compilation le define comme ça, t'es sûr que c'est défini partout. (-D CURL_STATICLIB) |
-D CURL_STATICLIB ??? Je dois faire quoi avec ça ?
Voilà ce que j'ai fait :
Code :
|
ça marche toujours pas, mais cette fois-ci l'erreur retounée est
| Citation : .objs\main.o:main.c |
| Citation :
|
Désolé mais je developpe sous CodeBlocks.
Je l'ai ajouté à la liste des define settings>compiler>define
| Citation : Si ça ne marche toujours pas, montre le contenu du fichier Makefile (Makefile.win sous windows) en masquant les paths si tu veux. Comme ça, on verra ce qui est compilé et lié. |
Le makefile n'est pas fait !
Voilà ce que j'ai :
- test.depend
Code :
|
Je pense pas que ce fichier puisse nous aidé.
- test.layout
Code :
|
Celui là non plus.
- main.o
(ouvert avec un éditeur de texte)
Code :
|
Là on retrouve le "_curl_easy_init ".
Voilà, merci de ta patience pour m'expliquer et m'aider. Mais c'est pas fini ;-) .
Oui maintenant la signature est celle d'une fonction statique qui là aussi est différente de celle présente dans la lib.
Dans le fichier lib .a, comment vois-tu la signature ?
Sinon, je pense que le seul bon moyen pour résoudre ça, c'est que tu recompile la lib curl.
Dans ton IDE, crée un nouveau projet pour faire une lib, mets-y les sources et compile le tout en précisant le define BUILDmachin.
| Citation :
|
Ok, mais c'est quoi BUILDmachin et je dois le mettre où ?
là où tu avais dit:
| Citation :
|
tu y ajoute simplement BUILDING_LIBCURL
Quand je lance la compilation, il y plein d'erreurs car il manque des dossiers et/ou fichiers et/ou les chemins sont incorrects.
Qu'est-ce qu'il faut faire ?
PS : apparament c'est des chemins relatifs, j'ai donc mis mon projet dans le dossier "curl-7.15.3", mais ça marche toujours pas... :-(
Je sais pas comment faire, je connais pas codeblocks.
Alors dis-moi comment faire avec Dev
S'il-te plait :-(
UP ;-)
Je devrais pas plutôt me trouvé une autre lib ? :-D
Peut-être.
Sinon, sous Dev-C++, il faut créer un nouveau projet DLL, y mettre tous les sources, ajouter la constante comme j'ai indiqué plus haut et tout recompiler.
J'ai réussi à compiler !!! :-D
En fait dans Dev, options projet > compilateur > linker, j'ai ajouté les .a de curl et la compilation a réussie.
Mais nouveau problème :
Cette dll n'est pas celle de curl. Que faire ?
(le dll de curl est dans le même dossier que l'exe)
C'est bon, merci google !
Ah ben non...
Maintenant j'ai droit à :
Là je sais pas du tout quoi faire :-?
ça, ça veut dire que tu as compiler avec une lib .a ou .lib qui contient la signature de fonction de ASN1_STRING_Data.
Or la dll ne contient pas cette signature, il n'y a pas cette fonction dans la dll.
Ceci arrive souvent quand on travaille avec des dll: c'est généralement dû à un problème de version de la dll.
La version du .dll ne correspond pas avec la version du .a ou .lib
Donc recherche une autre lib libeay32.dll ;-)
Donc, essaie de trouver une autre version de cette dll qui contient les mêmes point d'entrées.
heu... mais c quoi curl ?
dites-moi ... :
http://www.infos-du-net.com/forum/ [...] 21#1483260
OMGzor thread hijacking!
Curl c'est une bibliothèque de fonctions, d'après ce que j'ai compris.
Mais je vois pas pourquoi tu viens polluer les topics des autres avec ton lien... Si tu as besoin d'aide, attends un peu que les gens qui le peuvent (et le veulent) te répondent...
C'est bon, j'ai trouvé la bonne :-D !
sur dll-files elles datent de la guerre !
En bas de la page de download de curl, il y a les versions de SSL recommandées.
Voilà, il me reste plus que de la lecture.
Merci beaucoup pour ton aide CRicky ;-) !
Il y a 774 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
