Problème de compilation

Problème de compilation - C - Programmation

Marsh Posté le 11-05-2006 à 16:23:57    

Bonjour j'ai un problème de compilation et je voudrais avoir votre avis :
 
Commande de compilation :

Code :
  1. /usr/local/LxNETES-2.3/arm-elf/arm-elf/bin/gcc -elf2flt -o xwsClient xwsclient.c soapC.c soapClient.c
  2. /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/


Résultat :

Code :
  1. /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c: In function `soap_code_bits':
  2. /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c:1202: warning: comparison is always true due to limited range of data type
  3. /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c: In function `soap_value':
  4. /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c:10076: warning: comparison is always true due to limited range of data type
  5. /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c: In function `soap_getmimehdr':
  6. /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c:10563: warning: comparison is always true due to limited range of data type
  7. /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c: In function `http_parse':
  8. /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c:11942: warning: comparison is always true due to limited range of data type
  9. xwsClient.elf2flt: In function `tcp_gethost':
  10. xwsClient.elf2flt(.text+0x97d2c): undefined reference to `gethostbyname_r'
  11. xwsClient.elf2flt: In function `soap_string_out':
  12. xwsClient.elf2flt(.text+0xa2eb8): undefined reference to `__ctype_get_mb_cur_max'
  13. xwsClient.elf2flt(.text+0xa2ecc): undefined reference to `mbtowc'
  14. xwsClient.elf2flt: In function `soap_string_in':
  15. xwsClient.elf2flt(.text+0xa3784): undefined reference to `wctomb'
  16. xwsClient.elf2flt(.text+0xa3794): undefined reference to `__ctype_get_mb_cur_max'
  17. xwsClient.elf2flt: In function `soap_float2s':
  18. xwsClient.elf2flt(.text+0xa574c): undefined reference to `isnan'
  19. xwsClient.elf2flt: In function `soap_s2float':
  20. xwsClient.elf2flt(.text+0xa5a2c): undefined reference to `strtod'
  21. xwsClient.elf2flt: In function `soap_double2s':
  22. xwsClient.elf2flt(.text+0xa5fec): undefined reference to `isnan'
  23. xwsClient.elf2flt: In function `soap_s2double':
  24. xwsClient.elf2flt(.text+0xa62bc): undefined reference to `strtod'
  25. collect2: ld returned 1 exit status


Bon passons les warnings et intéressons nous aux "undefined reference to". Apparement c'est des problèmes de link.
Mais je ne sais pas comment connaitre les lib des fonctions qui me pose problème. Je connais les fichiers .h qui correspondent a ces fonctions mais ne connait pas les lib .a.
 
gethostbyname_r               -->  netdb.h  -->  lib???.a
__ctype_get_mb_cur_max  -->  ???.h       -->  lib???.a
mbtowc                               -->  stdlib.h    -->  lib???.a
wctomb                               -->  stdlib.h    -->  lib???.a
strtod                                  -->  stdlib.h    -->  lib???.a
isnan                                   -->  math.h    -->  libm.a
 
Voilà donc j'ai juste la lib de isnan qui est libm.a et effectivement i je rajoute "/usr/lib/libm.a" à la fin de ma commande de dompilation je n'ai plus l'erreur sur isnan mais me reste encore les autres.
 
Est-ce que je cherche dans le bon sens en cherchant à rajouter des "-I/usr/lib..." pour spécifier les librairies.
Si oui quelqu'un connait t'il les libs qu'il faut que j'ajoute.
SI non que dois-je faire.
 
Merci d'avance.


Message édité par Vilo5 le 11-05-2006 à 16:28:00
Reply

Marsh Posté le 11-05-2006 à 16:23:57   

Reply

Marsh Posté le 11-05-2006 à 16:35:57    

bah t'as essayé avec libc  en ajoutant  -lc ??

Reply

Marsh Posté le 11-05-2006 à 16:39:49    

enfin tu sembles faire une cross-compilation donc je pense qu'il faut lier avec les bonnes libs (libc, libm pour arm) donc en indiquant le bon chemin.


Message édité par SomeBugsInMe le 11-05-2006 à 16:40:01
Reply

Marsh Posté le 11-05-2006 à 16:45:16    

non ce serait des probleme d'include plutot (le chien de mickey).
 
Quoi qu'il en soit, in vilo veritas ...

Reply

Marsh Posté le 11-05-2006 à 17:09:01    

Oui oui c'est bien une cross-compil.
J'essaye donc de mettre les liens des libs pour arm.
 
J'ais étais un peu vite en disant "I/usr/lib/libm.a" en fait ça serait plutôt du "I/usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libm.a". Je voulais faire simple pour expliquer le PB.
 
En fait quand je fais une compilation normal et non croisé ma commande me donne aucune erreur et ça me créer un exécutable qui fonctionne très bien.

gcc -o xwsClient xwsclient.c soapC.c soapClient.c /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/


Par contre dès que je passe à la commande avec le cross-compiler pour arm (càd /usr/local/…/gcc –elf2flt) ca plante comme je l'ai dit précédemment.
 
 
Je ne sais donc pas quoi à la suite de cette commande, quel chemin, vers quel include ou quel lib.
Pour l'instant il y a que la libm.a qui me permet de réduire le nombre d'erreurs mais pour le reste je ne sais pas quoi mettre. C'est pas évident.
 
HELP ME  lol
 

SomeBugsInMe a écrit :

bah t'as essayé avec libc  en ajoutant  -lc ??


 
Non ca ne marche pas !


Message édité par Vilo5 le 12-05-2006 à 09:14:10
Reply

Marsh Posté le 11-05-2006 à 17:16:08    

-I c'est include
et -l pour linker (si je ne m'abuse)

Message cité 1 fois
Message édité par _darkalt3_ le 11-05-2006 à 17:16:23
Reply

Marsh Posté le 11-05-2006 à 17:16:40    

Peux-tu copier ici la ligne de commande complète que tu tapes (celle pour cross-compiler) ?
 
edit: en fait c'était effectivement pour voir les options utilisées car c'est -l (L minuscule) pour lier !


Message édité par SomeBugsInMe le 11-05-2006 à 17:18:32
Reply

Marsh Posté le 11-05-2006 à 17:22:18    

Voilà ce que je fais :
 
/usr/local/LxNETES-2.3/arm-elf/arm-elf/bin/gcc -elf2flt -o xwsClient xwsclient.c soapC.c soapClient.c /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/  
 
 
Avec ca ca m'enlève l'erreur sur isnan :
 
/usr/local/LxNETES-2.3/arm-elf/arm-elf/bin/gcc -elf2flt -o xwsClient xwsclient.c soapC.c soapClient.c /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/ /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libm.a
 
 
et je pense qu'il me faudrait une compil comme ca :
 
/usr/local/LxNETES-2.3/arm-elf/arm-elf/bin/gcc -elf2flt -o xwsClient xwsclient.c soapC.c soapClient.c /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/ /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libm.a     +  /usr/..................


Message édité par Vilo5 le 11-05-2006 à 17:24:44
Reply

Marsh Posté le 11-05-2006 à 17:23:37    

_darkalt3_ a écrit :

-I c'est include
et -l pour linker (si je ne m'abuse)


 
C'est possible oui. C'est même ce que je pensais.
 
Mais quand je met -I/..../lib/libm.a  ca marche un peu puisque ca m'enlève une erreur. Enfin je crois.

Message cité 1 fois
Message édité par Vilo5 le 11-05-2006 à 17:23:58
Reply

Marsh Posté le 11-05-2006 à 18:13:20    

essaie :
 


/usr/local/LxNETES-2.3/arm-elf/arm-elf/bin/gcc -elf2flt -o xwsClient xwsclient.c soapC.c soapClient.c /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/ -l/usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libm.a -l/usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libc.a


 
Note bien qu'il y a des -l (L minuscule) devant les 2 libs

Reply

Marsh Posté le 11-05-2006 à 18:13:20   

Reply

Marsh Posté le 11-05-2006 à 20:48:45    

Vilo5 a écrit :

C'est possible oui. C'est même ce que je pensais.
 
Mais quand je met -I/..../lib/libm.a  ca marche un peu puisque ca m'enlève une erreur. Enfin je crois.


 
ca c'est impossible, -I... est directement passé à cpp, si tu lui passes un chemin invalide ca aura juste aucun effet
 
si tu veux lier avec un libm qui n'est pas dans /lib ou /usr/lib tu dois preciser son nom complet

Reply

Marsh Posté le 11-05-2006 à 23:51:27    

ok ok
 
j'essaye ca demain matin a mon arrivé au boulot.
 
Mais je me demande si mon pb ne viens pas d'ailleurs, à savoir mes librairie gsoap dont je donne le chemin avec :
 
-I/home/olivier/gsoap-2.7/soapcpp2/
 
En fait quand je compile avec gcc normal en non croisé ca marche mais pas quand je fais la cross-compil.
 
Cela ne viendrait pas tout simplement du fait que mes libs de gsoap sont compatibles uniquement pour du x86. Il faudrait peut etre que je regarde si j'ai les sources de ces librairies et que je les compil seules avec le compilateur croisé et que ensuite je recompile mon application avec le compilateur croisé en spécifiant cette fois le chemin des librairie soap que j'ai précedement compilé pour du arm.
 
enfin je suis pas sure de ce que j'avance et ne sait pas non plus si c'est faisable.

Reply

Marsh Posté le 12-05-2006 à 09:13:33    

SomeBugsInMe a écrit :

essaie :
 


/usr/local/LxNETES-2.3/arm-elf/arm-elf/bin/gcc -elf2flt -o xwsClient xwsclient.c soapC.c soapClient.c /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/ -l/usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libm.a -l/usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libc.a


 
Note bien qu'il y a des -l (L minuscule) devant les 2 libs


 
Bon alors j'ai essayé plusieurs choses.
 
en 1er ta solution :
 
mais apparement il n'aime pas les -l car il me renvoie une erreur : " cannot find -l/usr/..../libm.a "
 
Ensuite :
 
J'ai essayé de remplacer tes -l par des -L, -I, -i, mais ca ne fait rien, c'est comme si je ne le lui passer aucun lien de librairie il ne m'envoie pas d'erreur comme avec -l (cannot find), mais ne règle aucun de mais pb de compilation. En gros c'est la même chose qui si je fait ca :

/usr/local/LxNETES-2.3/arm-elf/arm-elf/bin/gcc -elf2flt -o xwsClient xwsclient.c soapC.c soapClient.c /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/


 
pour finir le seul cas qui règle quelque chose c'est quand je fait ca :  

/usr/local/LxNETES-2.3/arm-elf/arm-elf/bin/gcc -elf2flt -o xwsClient xwsclient.c soapC.c soapClient.c /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/ /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libm.a

 
 
Donc c'est quand je rajoute a la suite du 1er -I (càd celui sur soapcpp2) le chemin d'une librairie sans spécifier de -quelque chose devant.
 
Comme je l'avais dit avant ce cas m'enlève l'erreur sur la fonction isnan.
 

Reply

Marsh Posté le 12-05-2006 à 10:41:34    

Ne fais pas n'importe quoi non plus : -I sert à indiquer un chemin de recherche des en-têtes et -L sert à indiquer le chemin pour les libs. Si tu veux lier avec une bibliothèque, utilise -l
 
Peux-tu vérifier si les libs libm.a et libc.a se trouvent dans /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/  ??

Reply

Marsh Posté le 12-05-2006 à 10:47:09    

Citation :

J'ai essayé de remplacer tes -l par des -L, -I, -i, mais ca ne fait rien


 
c'te mélange [:pingouino]
 
éventuellement, ne panique pas et lis la doc des options de compilation calmement, et vérifie tout point à point.

Reply

Marsh Posté le 12-05-2006 à 10:55:34    

SomeBugsInMe a écrit :

Ne fais pas n'importe quoi non plus : -I sert à indiquer un chemin de recherche des en-têtes et -L sert à indiquer le chemin pour les libs. Si tu veux lier avec une bibliothèque, utilise -l
 
Peux-tu vérifier si les libs libm.a et libc.a se trouvent dans /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/  ??


 
Oui, les libs libm.a et libc.a se trouvent bien dans /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/ .
C'est bien pour ca que je comprend pas et test des trucs bizarres.
 

SomeBugsInMe a écrit :

Ne fais pas n'importe quoi non plus : -I sert à indiquer un chemin de recherche des en-têtes et -L sert à indiquer le chemin pour les libs. Si tu veux lier avec une bibliothèque, utilise -l
 
Peux-tu vérifier si les libs libm.a et libc.a se trouvent dans /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/  ??


 
Bon alors je suis conscient que je test des trucs bizarre, j'ai déjà regardé un peu la doc.
Je sais que normalement :
-I c'est pour les includes, les entêtes
-L pour les librairies quand on indique le chemin complet
-l quand on fait juste -lm pour libm.a ou -lc pour libc.a
 
Mais c'est tout de même bizarre le sresultat que j'obtiens. Donc j'ai tester tout cà. de plus avec -l ca ne marche pas donc je comprend pas.


Message édité par Vilo5 le 12-05-2006 à 10:56:12
Reply

Marsh Posté le 12-05-2006 à 11:20:20    

En fait, j'me suis planté : y'a pas besoin de -l si on indique les chemins des libs. [:petrus75]
Donc :
 


/usr/local/LxNETES-2.3/arm-elf/arm-elf/bin/gcc -elf2flt -o xwsClient xwsclient.c soapC.c soapClient.c /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/ /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libm.a /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libc.a


 
devrait marcher.
 
Après je ne m'y connais pas en cross-compilation donc faudrait que tu cherches un tuto sur le web. Faudrait peut-être ajouter -nostdlib à la commande...

Reply

Marsh Posté le 12-05-2006 à 11:24:57    

SomeBugsInMe a écrit :

En fait, j'me suis planté : y'a pas besoin de -l si on indique les chemins des libs. [:petrus75]
Donc :
 


/usr/local/LxNETES-2.3/arm-elf/arm-elf/bin/gcc -elf2flt -o xwsClient xwsclient.c soapC.c soapClient.c /home/olivier/gsoap-2.7/soapcpp2/stdsoap2.c -I/home/olivier/gsoap-2.7/soapcpp2/ /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libm.a /usr/local/LxNETES/arm-elf/uClibc-0.9.19/lib/libc.a


 
devrait marcher.
 
Après je ne m'y connais pas en cross-compilation donc faudrait que tu cherches un tuto sur le web. Faudrait peut-être ajouter -nostdlib à la commande...


 
Oui ok pas besoin des -l si j'indique le chemin des libs.
 
-nostdlib je ne connaissais pas je vais essayer.
 
Bon en tout cas c'est sure ca doit être une histoire d ecross compil.
J'en ai déjà fait mais des plus simple.
 
Celle-ci est plus dure car je melle cross-compil avec compilation soap et fait appel a des libs soap qui ne sont pas prévu pour de l'arm.  
 
GGrrrrr  :pt1cable: , je ne sais même pas si je cherche dans le bon sens.

Message cité 1 fois
Message édité par Vilo5 le 12-05-2006 à 11:25:51
Reply

Marsh Posté le 12-05-2006 à 11:34:22    

Vilo5 a écrit :

Oui ok pas besoin des -l si j'indique le chemin des libs.
 
-nostdlib je ne connaissais pas je vais essayer.


 
Lis le man où Google pour avoir la liste des options de GCC
 

Citation :

des libs soap qui ne sont pas prévu pour de l'arm.


 
Ah pas sûr que ça marche alors  [:pingouino]
 
Trouve-toi un howto pour te guider étape par étape.

Message cité 1 fois
Message édité par SomeBugsInMe le 12-05-2006 à 11:34:51
Reply

Marsh Posté le 12-05-2006 à 11:38:50    

SomeBugsInMe a écrit :

Lis le man où Google pour avoir la liste des options de GCC


ok

SomeBugsInMe a écrit :


Citation :

des libs soap qui ne sont pas prévu pour de l'arm.


 
Ah pas sûr que ça marche alors  [:pingouino]
 
Trouve-toi un howto pour te guider étape par étape.


 
J'aimerai bien mais pas évident.
 
J'ai une tres grosse doc avec gsoap, mais ca ne parle pas du tout de cross-compil.
Des docs sur la cross-compil ca se trouve.
Mais des doc sur de la cross-compil avec gsoap c'est introuvable et dans mon cas c'est ca qu'il me faudrait.
 
Si quelqu'un trouve ca, c'est un champion. Je serai trop heureux.


Message édité par Vilo5 le 12-05-2006 à 11:43:59
Reply

Marsh Posté le 12-05-2006 à 11:48:23    

Peut-être en posant ta question dans un forum ou sur une mailing-list sur gsoap ou arm (si ça existe), tu auras des réponses ??
 :hello:

Reply

Marsh Posté le 12-05-2006 à 12:00:40    

SomeBugsInMe a écrit :

Peut-être en posant ta question dans un forum ou sur une mailing-list sur gsoap ou arm (si ça existe), tu auras des réponses ??
 :hello:


 
Merci c'est déjà fait ici : http://groups.yahoo.com/group/gsoap/
 
message :
http://groups.yahoo.com/group/gsoap/message/11612
et http://groups.yahoo.com/group/gsoap/message/11638
 
 
Mais pas de réponse.
 
 
PS: Vu mon super niveau en anglais c'est peut etre pas étonnant.


Message édité par Vilo5 le 12-05-2006 à 12:02:40
Reply

Marsh Posté le 12-05-2006 à 16:11:30    

Pas d'autre idée ?
 
je n'avance pas, j'ai encore rien trouvé concret !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed