Problème de link étrange - C++ - Programmation
Marsh Posté le 14-04-2009 à 08:28:59
Up
je vais voir si il y a moyen de recompiler les libs gSOAP avec SunCC mais c'est pas garanti/gagné, les seuls binaires qu'on trouve sont compilés avec g++.
Je suis donc toujours à la recherche d'une solution
Merci à ceux qui pourront apporter leur grain de sel
Marsh Posté le 14-04-2009 à 10:46:26
En general, tu ne peux pas lier du C++ compile avec deux compilateurs differents (il y a quelques cas particuliers ou c'est possible, mais a ma connaissance ce n'est pas le cas entre SunCC et g++, surtout sur Sparc).
Marsh Posté le 14-04-2009 à 15:44:53
C'est bien ce que je pensais malheureusement
Bon en attendant de savoir si j'ai possibilité d'avoir gSOAP compilé avec SunCC j'ai découplé le client en deux, une partie qui s'occupe d'être client de l'autre logiciel, et l'autre qui s'occupe de la partie gSOAP.
Lorsque la première partie est averti d'une action, elle est transmise à l'autre programme qui s'occupe de se connecter au serveur du web service et de lui envoyer les infos.
Du coup le serveur et client gSOAP sont compilés avec g++, et l'autre partie du client est compilé avec SunCC .
Merci pour l'info en tout cas
Marsh Posté le 09-04-2009 à 16:14:15
Hello everybody ,
je suis sur un problème depuis ce matin et je ne parviens pas à trouver de solutions, j'espère qu'un guru pourra m'aider
Je tente de compiler un client/server webservice C++ utilisant la lib gSOAP sur Solaris, le problème est que le client doit être linké avec une lib qui ne tourne que sur Solaris (lib proprio).
Serveur: utilise seulement gSOAP et C++ standard, compile/link très bien avec g++ mais ne link pas avec Sun CC
l'erreur est la suivante avec Sun CC:
Undefined first referenced
symbol in file
soap::~soap #Nvariant 1() src/soap/soappocService.o
soap::soap #Nvariant 1() src/soap/soappocService.o
ld: fatal: Symbol referencing errors. No output written to pocServer
*** Error code 1
Client: utilise gSOAP plus la lib proprio, compile mais problème au link pour la partie gSOAP avec g++ mais pas avec l'autre librairie, alors qu'avec Sun CC ça compile/link la partie de l'autre librairie mais ça ne fonctionne pas pour la lib GSOAP.
Erreur avec g++:
Undefined first referenced
symbol in file
K_OkapiRDVHandler_c::K_OkapiRDVHandler_c()src/pocClient.o
K_OkapiTCPHandler_c::K_OkapiTCPHandler_c()src/pocClient.o
ld: fatal: Symbol referencing errors. No output written to pocClient
collect2: ld returned 1 exit status
Erreur avec Sun CC: la même que pour la partie Serveur.
J'ai donc regardé si les lib qui contiennent ces définitions sont bien passées au link et c'est le cas.
Serveur: (donc quand erreur avec Sun CC)
$ nm -CA /usr/local/lib/libgsoap++.a | grep "soap::.*soap()"
/usr/local/lib/libgsoap++.a[libgsoap___a-stdsoap2_cpp.o]: [120] | 183288| 48|FUNC |GLOB |0 |2 |soap::soap()
/usr/local/lib/libgsoap++.a[libgsoap___a-stdsoap2_cpp.o]: [102] | 183240| 48|FUNC |GLOB |0 |2 |soap::soap()
/usr/local/lib/libgsoap++.a[libgsoap___a-stdsoap2_cpp.o]: [204] | 183912| 112|FUNC |GLOB |0 |2 |soap::~soap()
/usr/local/lib/libgsoap++.a[libgsoap___a-stdsoap2_cpp.o]: [189] | 183800| 112|FUNC |GLOB |0 |2 |soap::~soap()
/usr/local/lib/libgsoap++.a[libgsoap___a-stdsoap2_cpp.o]: [167] | 183688| 112|FUNC |GLOB |0 |2 |soap::~soap()
$ nm -CA src/soap/soappocService.o | grep "soap::.*soap()"
src/soap/soappocService.o: [29] | 0| 0|NOTY |GLOB |0 |UNDEF |soap::soap()
src/soap/soappocService.o: [50] | 0| 0|NOTY |GLOB |0 |UNDEF |soap::~soap()
Client: (donc quand erreur avec g++, avec SunCC c'est la même erreur que juste au dessus)
$ nm -CA libOKAPIRDV.a | grep "K_OkapiRDVHandler_c::K_OkapiRDVHandler_c()"
libOKAPIRDV.a[K_OkapiRDVHandler_class.o]: [65] | 0| 460|FUNC |GLOB |0 |2 |K_OkapiRDVHandler_c::K_OkapiRDVHandler_c()
$ nm -CA src/pocClient.o | grep "K_OkapiRDVHandler_c::K_OkapiRDVHandler_c()"
src/pocClient.o: [43] | 0| 0|NOTY |GLOB |0 |UNDEF |K_OkapiRDVHandler_c::K_OkapiRDVHandler_c()
Au final je suis coincé car le Serveur je peux le compiler et linker avec g++ mais le client utilise les deux librairies et chacune ne link qu'avec un des deux compilos, je ne sais pas bien comment faire .
Alors voila mes questions :
1) C'est quoi #Nvariant 1() Est-ce resolvable et pourquoi g++ s'en sort très bien avec et non pas SunCC ?
2) Pourquoi dans les deux cas je peux retrouver les définitions des symboles via l'utilitaire nm alors qu'ils sont indiqués comme undéfinis avec g++/SunCC (Les libs sont bien passées au link).
J'ai cru à un problème d'ordre donc j'ai adopté la solution bourrin qui consiste à copier/coller plusieurs fois les libs les unes à la suite des autres histoire qu'au bout d'un moment il ai résolu les problèmes de link mais ça n'y change rien
3) la question magique: comment résoudre le problème, avec g++ ou sunCC ça m'est égal pour le moment, si vous savez pour les 2 je suis preneur aussi
Infos peut être utiles (sachant que je n'ai pas la main sur le serveur pour installer/updater/patcher quoi que ce soit à priori):
$ g++ --version
g++ (GCC) 3.4.6
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ CC -V
CC: Sun C++ 5.9 SunOS_sparc Patch 124863-01 2007/07/25
Et finalement l'execution du makefile :
g++:
$ make
Compiling poc Server...
g++ -o src/pocServer.o -c src/pocServer.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -I$OKAPI_INCLUDE
g++ -o src/soap/soapC.o -c src/soap/soapC.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -O -I$OKAPI_INCLUDE
g++ -o src/soap/soappocService.o -c src/soap/soappocService.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -O -I$OKAPI_INCLUDE
g++ -o src/sybase++/Sybase.o -c src/sybase++/Sybase.cpp --I$GSOAP_INCLUDE -I$SYB_INCLUDE -O -I$OKAPI_INCLUDE
g++ -o src/sybase++/SybResult.o -c src/sybase++/SybResult.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -O -I$OKAPI_INCLUDE
Creating poc Server executable...
g++ -o pocServer src/pocServer.o src/soap/soapC.o src/soap/soappocService.o src/sybase++/Sybase.o src/sybase++/SybResult.o -L$GSOAP_LIB -L$SYB_LIB -L$OKAPI_LIB -mt -i -lgsoap++ -lOKAPIRDV -lOKAPI -lOKAPICOMPRESS -lKRYPTON -linfracpptools27 -ltibrvft -ltibrvcm -ltibrv -ltibrvcmq -ltibrvcpp -lsybdb -lsybct -lsybcs -ldl -lm -lsocket -lnsl -lrt -lxnet -lstdc++
Done
Compiling poc Client...
g++ -o src/pocClient.o -c src/pocClient.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -I$OKAPI_INCLUDE
g++ -o src/soap/soappocProxy.o -c src/soap/soappocProxy.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -I$OKAPI_INCLUDE
Creating poc Client executable...
g++ -o pocClient src/soap/soapC.o src/pocClient.o src/soap/soappocProxy.o -L$GSOAP_LIB -L$SYB_LIB -L$OKAPI_LIB -mt -i -lgsoap++ -lOKAPIRDV -lOKAPI -lOKAPICOMPRESS -lKRYPTON -linfracpptools27 -ltibrvft -ltibrvcm -ltibrv -ltibrvcmq -ltibrvcpp -lsybdb -lsybct -lsybcs -ldl -lm -lsocket -lnsl -lrt -lxnet -lstdc++
Undefined first referenced
symbol in file
K_OkapiRDVHandler_c::K_OkapiRDVHandler_c()src/pocClient.o
K_OkapiTCPHandler_c::K_OkapiTCPHandler_c()src/pocClient.o
ld: fatal: Symbol referencing errors. No output written to pocClient
collect2: ld returned 1 exit status
*** Error code 1
make: Fatal error: Command failed for target `pocClient'
SunCC: (mêmes erreurs pour Client/Serveur)
$ make
Compiling poc Server...
CC -o src/pocServer.o -c src/pocServer.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -I$OKAPI_INCLUDE
CC -o src/soap/soapC.o -c src/soap/soapC.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -I$OKAPI_INCLUDE
"src/soap/soapC.cpp", line 422: Warning (Anachronism): Formal argument finstantiate of type extern "C" void*(*)(soap*,int,const char*,const char*,unsigned*) in call to soap_id_enter(soap*, const char*, void*, int, unsigned, unsigned, const char*, const char*, extern "C" void*(*)(soap*,int,const char*,const char*,unsigned*)) is being passed void*(*)(soap*,int,const char*,const char*,unsigned*).
"src/soap/soapC.cpp", line 547: Warning (Anachronism): Formal argument fcopy of type extern "C" void(*)(soap*,int,int,void*,unsigned,const void*,unsigned) in call to soap_id_forward(soap*, const char*, void*, unsigned, int, int, unsigned, unsigned, extern "C" void(*)(soap*,int,int,void*,unsigned,const void*,unsigned)) is being passed void(*)(soap*,int,int,void*,unsigned,const void*,unsigned).
"src/soap/soapC.cpp", line 564: Warning (Anachronism): Formal argument fdelete of type extern "C" int(*)(soap_clist*) in call to soap_link(soap*, void*, int, int, extern "C" int(*)(soap_clist*)) is being passed int(*)(soap_clist*).
"src/soap/soapC.cpp", line 749: Warning (Anachronism): Formal argument fdelete of type extern "C" int(*)(soap_clist*) in call to soap_link(soap*, void*, int, int, extern "C" int(*)(soap_clist*)) is being passed int(*)(soap_clist*).
"src/soap/soapC.cpp", line 863: Warning (Anachronism): Formal argument fdelete of type extern "C" int(*)(soap_clist*) in call to soap_link(soap*, void*, int, int, extern "C" int(*)(soap_clist*)) is being passed int(*)(soap_clist*).
"src/soap/soapC.cpp", line 985: Warning (Anachronism): Formal argument fdelete of type extern "C" int(*)(soap_clist*) in call to soap_link(soap*, void*, int, int, extern "C" int(*)(soap_clist*)) is being passed int(*)(soap_clist*).
"src/soap/soapC.cpp", line 1109: Warning (Anachronism): Formal argument fdelete of type extern "C" int(*)(soap_clist*) in call to soap_link(soap*, void*, int, int, extern "C" int(*)(soap_clist*)) is being passed int(*)(soap_clist*).
"src/soap/soapC.cpp", line 1213: Warning (Anachronism): Formal argument fdelete of type extern "C" int(*)(soap_clist*) in call to soap_link(soap*, void*, int, int, extern "C" int(*)(soap_clist*)) is being passed int(*)(soap_clist*).
"src/soap/soapC.cpp", line 1307: Warning (Anachronism): Formal argument fcopy of type extern "C" void(*)(soap*,int,int,void*,unsigned,const void*,unsigned) in call to soap_id_forward(soap*, const char*, void*, unsigned, int, int, unsigned, unsigned, extern "C" void(*)(soap*,int,int,void*,unsigned,const void*,unsigned)) is being passed void(*)(soap*,int,int,void*,unsigned,const void*,unsigned).
"src/soap/soapC.cpp", line 1329: Warning (Anachronism): Formal argument fdelete of type extern "C" int(*)(soap_clist*) in call to soap_link(soap*, void*, int, int, extern "C" int(*)(soap_clist*)) is being passed int(*)(soap_clist*).
"src/soap/soapC.cpp", line 1421: Warning (Anachronism): Formal argument fcopy of type extern "C" void(*)(soap*,int,int,void*,unsigned,const void*,unsigned) in call to soap_id_forward(soap*, const char*, void*, unsigned, int, int, unsigned, unsigned, extern "C" void(*)(soap*,int,int,void*,unsigned,const void*,unsigned)) is being passed void(*)(soap*,int,int,void*,unsigned,const void*,unsigned).
"src/soap/soapC.cpp", line 1443: Warning (Anachronism): Formal argument fdelete of type extern "C" int(*)(soap_clist*) in call to soap_link(soap*, void*, int, int, extern "C" int(*)(soap_clist*)) is being passed int(*)(soap_clist*).
12 Warning(s) detected.
CC -o src/soap/soappocService.o -c src/soap/soappocService.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -I$OKAPI_INCLUDE
"src/soap/soappocService.cpp", line 27: Warning: imode hides soap::imode.
"src/soap/soappocService.cpp", line 27: Warning: omode hides soap::omode.
"src/soap/soappocService.cpp", line 31: Warning: imode hides soap::imode.
"src/soap/soappocService.cpp", line 31: Warning: omode hides soap::omode.
"src/soap/soappocService.cpp", line 31: Warning: namespaces hides soap::namespaces.
"src/soap/soappocService.cpp", line 78: Warning: os hides soap::os.
"src/soap/soappocService.cpp", line 82: Warning: buf hides soap::buf.
"src/soap/soappocService.cpp", line 91: Warning: port hides soap::port.
"src/soap/soappocService.cpp", line 106: Warning: host hides soap::host.
"src/soap/soappocService.cpp", line 106: Warning: port hides soap::port.
10 Warning(s) detected.
CC -o src/sybase++/Sybase.o -c src/sybase++/Sybase.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -I$OKAPI_INCLUDE
CC -o src/sybase++/SybResult.o -c src/sybase++/SybResult.cpp -I$GSOAP_INCLUDE -I$SYB_INCLUDE -I$OKAPI_INCLUDE
Creating poc Server executable...
CC -o pocServer src/pocServer.o src/soap/soapC.o src/soap/soappocService.o src/sybase++/Sybase.o src/sybase++/SybResult.o -L$GSOAP_LIB -L$SYB_LIB -L$OKAPI_LIB -mt -i -lgsoap++ -lOKAPIRDV -lOKAPI -lOKAPICOMPRESS -lKRYPTON -linfracpptools27 -ltibrvft -ltibrvcm -ltibrv -ltibrvcmq -ltibrvcpp -lsybdb -lsybct -lsybcs -ldl -lm -lsocket -lnsl -lrt -lxnet -lstdc++
Undefined first referenced
symbol in file
soap::~soap #Nvariant 1() src/soap/soappocService.o
soap::soap #Nvariant 1() src/soap/soappocService.o
ld: fatal: Symbol referencing errors. No output written to pocServer
*** Error code 1
make: Fatal error: Command failed for target `pocServer'
Merci à tous ceux qui sauront m'éclairer car je suis perdu...
Message édité par Flaie le 14-04-2009 à 08:27:21
---------------
Always wear a camera!