Tom's Guide > Forum > Programmation > |Résolu| [C] Impossible de compiler, mauvaise install de la libraire ?

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

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

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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



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 ?

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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 :
  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 ):

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

Répondre à CRicky

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 ?

Répondre à aerocell

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"

Répondre à CRicky

J'ai mis "#define CURL_STATICLIB" dans curl.h et la compilation foire toujours...
C'est bien ça qui fallait faire ?

Répondre à aerocell

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é.

Répondre à CRicky

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


ç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

Code :
  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

Code :
  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)

Code :
  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 ;-) .

Répondre à aerocell

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.

Répondre à CRicky

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ù ?

Répondre à aerocell

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

Répondre à CRicky

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... :-(

Répondre à aerocell

Je sais pas comment faire, je connais pas codeblocks.

Répondre à CRicky

Alors dis-moi comment faire avec Dev
S'il-te plait :-(

Répondre à aerocell

UP ;-)

Je devrais pas plutôt me trouvé une autre lib ? :-D

Répondre à aerocell

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.

Répondre à CRicky

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 :
http://img294.imageshack.us/img294/8228/argh5ca.png
Cette dll n'est pas celle de curl. Que faire ?
(le dll de curl est dans le même dossier que l'exe)

Répondre à aerocell

C'est bon, merci google !

Répondre à aerocell

Ah ben non...
Maintenant j'ai droit à :
http://img107.imageshack.us/img107/748/reargh3xz.png

Là je sais pas du tout quoi faire :-?

Répondre à aerocell

ç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.

Répondre à CRicky

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...

Répondre à Rakipu

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 ;-) !

Répondre à aerocell
Tom's Guide > Forum > Programmation > |Résolu| [C] Impossible de compiler, mauvaise install de la libraire ?
Aller à :

Il y a 774 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens