Votre question

|Résolu| [C] Impossible de compiler, mauvaise install de la libraire ?

Tags :
  • Compile
  • Programmation
Dernière réponse : dans Programmation
11 Mai 2006 19:08:27

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 :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <curl\curl.h>
  4. #include <curl\easy.h>
  5.  
  6. int main()
  7. {
  8. curl_easy_init();
  9.  
  10. printf("Salut !\n");
  11. system("pause");
  12.  
  13. return 0;
  14. }


Le message d'erreur :
Citation :

Project : Test CURL
Compiler : GNU GCC Compiler (called directly)
Directory : C:\''''''''''''''''''''''''''''''''''''''''''''''''\test\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
Linking console executable: C:\''''''''''''''''''''''''''''\test.exe
.objs\main.o:main.c:( .text+0x2b): undefined reference to `_imp__curl_easy_init'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 4 seconds)
0 errors, 0 warnings



Vous pouvez m'aider ?

Autres pages sur : resolu impossible compiler mauvaise install libraire

a b L Programmation
11 Mai 2006 20:16:31

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:
  1. CURL_EXTERN CURL *curl_easy_init(void);

Il faut voir où sont définies ces constantes, c'est dans curl.h (c'est toujours comme ça :-D ):

  1. typedef void CURL;
  2.  
  3. //...
  4.  
  5. /*
  6. * Decorate exportable functions for Win32 DLL linking.
  7. * This avoids using a .def file for building libcurl.dll.
  8. */
  9. #if (defined(WIN32) || defined(_WIN32)) && !defined(CURL_STATICLIB)
  10. #if defined(BUILDING_LIBCURL)
  11. #define CURL_EXTERN __declspec(dllexport)
  12. #else
  13. #define CURL_EXTERN __declspec(dllimport)
  14. #endif
  15. #else
  16. #define CURL_EXTERN
  17. #endif

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 ?
12 Mai 2006 19:03:42

Citation :

CRicky a écrit :
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 ?


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 ?
Contenus similaires
a b L Programmation
12 Mai 2006 19:24:55

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"
12 Mai 2006 19:54:17

J'ai mis "#define CURL_STATICLIB" dans curl.h et la compilation foire toujours...
C'est bien ça qui fallait faire ?
a b L Programmation
12 Mai 2006 21:04:49

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é.
13 Mai 2006 12:36:43

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 :
  1. #define CURL_STATICLIB
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <curl\curl.h>
  5. #include <curl\easy.h>
  6.  
  7. int main()
  8. {
  9. curl_easy_init();
  10.  
  11. printf("Salut !\n");
  12. system("pause");
  13.  
  14. return 0;
  15. }

ça marche toujours pas, mais cette fois-ci l'erreur retounée est
Citation :
.objs\main.o:main.c:( .text+0x2b): undefined reference to `curl_easy_init'


Citation :

sous Dev-C++, à ajouter dans options projet, parametres, compilateur et compilateur C++

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
  1. # depslib dependency file v1.0
  2. 1147515510 c:\''''''''''''''''''''''\main.c
  3. <stdio.h>
  4. <stdlib.h>
  5. <curl\curl.h>
  6. <curl\easy.h>

Je pense pas que ce fichier puisse nous aidé.

- test.layout
  1. <?xml version="1.0"?>
  2. <!DOCTYPE CodeBlocks_layout_file>
  3. <CodeBlocks_layout_file>
  4. <File name="main.c" open="1" top="1">
  5. <Cursor position="2" topLine="0"/>
  6. </File>
  7. </CodeBlocks_layout_file>

Celui là non plus.

- main.o
(ouvert avec un éditeur de texte)
  1. L Z .text P ´ `.data @ À.bss € À.rdata @ @U‰åƒìƒä𸠃ÀƒÀÁèÁà‰Eü‹Eüè è è Ç$ è Ç$ è ¸ ÉАSalut !
  2. pause !
  3. & + 2 7 > C .file þÿ gmain.c _main .text N .data .bss .rdata ___main __alloca _system _printf _curl_easy_init

Là on retrouve le "_curl_easy_init ".

Voilà, merci de ta patience pour m'expliquer et m'aider. Mais c'est pas fini ;-) .
a b L Programmation
13 Mai 2006 14:27:26

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.
14 Mai 2006 15:59:40

Citation :

CRicky a écrit :
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.


Ok, mais c'est quoi BUILDmachin et je dois le mettre où ?
a b L Programmation
14 Mai 2006 18:07:38

là où tu avais dit:
Citation :

Désolé mais je developpe sous CodeBlocks.
Je l'ai ajouté à la liste des define settings>compiler>define

tu y ajoute simplement BUILDING_LIBCURL
14 Mai 2006 18:39:10

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... :-(
a b L Programmation
15 Mai 2006 12:59:45

Je sais pas comment faire, je connais pas codeblocks.
16 Mai 2006 21:26:38

Alors dis-moi comment faire avec Dev
S'il-te plait :-(
17 Mai 2006 18:49:23

UP ;-)

Je devrais pas plutôt me trouvé une autre lib ? :-D
a b L Programmation
17 Mai 2006 20:17:54

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.
19 Mai 2006 17:41:49

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)
19 Mai 2006 17:44:09

C'est bon, merci google !
19 Mai 2006 17:54:41

Ah ben non...
Maintenant j'ai droit à :


Là je sais pas du tout quoi faire :-?
a b L Programmation
19 Mai 2006 18:52:59

ç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.
19 Mai 2006 19:39:21

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...
19 Mai 2006 20:07:50

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 ;-) !
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS