2015-09-22 1 views
2

Nous avons développé une application C++ simple en utilisant gSoap. Lorsque nous utilisons Makefile classique, tout est OK et le système fonctionne correctement. Mais lorsque l'on utilise GNU autotools comme système de construction, nous rencontrons une erreur de validation étrange violation de contrainte lorsque nous appelons le service:Comportement différent lorsque automake est utilisé pour construire une application gSoap

(SOAP 1.1 fault: SOAP-ENV:Client [no subcode] 
"Validation constraint violation: invalid value in element 'risk'" 
Detail: [no detail] 

Nous avons vérifié tous les Compilez et comme des drapeaux et les deux ont le même aspect.

Makefile.am

ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4 
AUTOMAKE_OPTIONS = subdir-objects 
AM_CPPFLAGS = --pedantic -Wall -Wno-vla -Wno-unknown-pragmas -Wno-format 
bin_PROGRAMS= Client Server 
Client_SOURCES=card_soap_client.cpp envC.cpp stdsoap2.cpp cardProxy.cpp cardC.cpp 
Client_CPPFLAGS= $(AM_CPPFLAGS) -DWITH_NONAMESPACES 
Server_SOURCES=card_soap_server.cpp envC.cpp stdsoap2.cpp cardService.cpp cardC.cpp 
Server_CPPFLAGS= $(AM_CPPFLAGS) -DWITH_NONAMESPACES 

Makefile

CF=-c -Wall --pedantic -Wno-vla -Wno-unknown-pragmas -Wno-format -g -O2 -fPIC -DPIC -DWITH_NONAMESPACES 
LF = -g -O2 
all: card_soap_client.o card_soap_server.o cardProxy.o cardService.o cardC.o envC.o stdsoap2.o 
     g++ card_soap_client.o cardProxy.o cardC.o envC.o stdsoap2.o $(LF) -o Client 
     g++ card_soap_server.o cardService.o cardC.o envC.o stdsoap2.o $(LF) -o Server 
cardC.o:cardC.cpp 
     g++ $(CF) cardC.cpp 
cardService.o:cardService.cpp 
     g++ $(CF) cardService.cpp 
cardProxy.o:cardProxy.cpp 
     g++ $(CF) cardProxy.cpp 
envC.o: envC.cpp 
     g++ $(CF) envC.cpp 
stdsoap2.o: stdsoap2.cpp 
     g++ $(CF) stdsoap2.cpp 
card_soap_client.o:card_soap_client.cpp 
     g++ $(CF) card_soap_client.cpp 
card_soap_server.o:card_soap_server.cpp 
     g++ $(CF) card_soap_server.cpp 

Nous avons généré le service à l'aide 2.8.9 et 2.8.23 et compilé avec g ++ - 4.7. Le service est généré avec la commande suivante:

soapcpp2 -i -n -qcard -I/usr/share/gsoap/import/ interface_v1.3.1.hpp 

MISE À JOUR: La source complète est disponible here

+0

L'avez-vous essayé sur un autre ordinateur? – ZivS

+0

Comment les messages XML envoyés par le (s) client (s) ressemblent-ils? Sont-ils identiques? –

+0

@ZivS Mêmes résultats ici. Je peux reproduire la même erreur en utilisant autotools sur ma machine (Debian 8.1) –

Répondre

1

La racine du mal est le fichier config.h qui est généré par des outils autoconf. Regardez CF var de your Makefile. Si vous ajoutez -DHAVE_CONFIG_H -I. -I.. à savoir votre CF sera

CF=-c -Wall -DHAVE_CONFIG_H -I. -I.. --pedantic -Wno-vla -Wno-unknown-pragmas -Wno-format -g -O2 -fPIC -DPIC -DWITH_NONAMESPACES

alors vous aurez la même erreur que dans la variante automake de compilation

ÉDITÉ Regardez fonction soap_s2double dans le fichier stdsoap2.cpp. Si nous activons les macros HAVE_CONFIG_H (via l'option -DHAVE_CONFIG_H), cela désactive à son tour les macros HAVE_STRTOD (regardez le fichier stdsoap2.h). Comme résultat nous avons l'erreur SOAP_TYPE (parce que nous ne pouvons pas convertir la valeur de chaîne du risk var en double). Si nous travaillons sans macros HAVE_CONFIG_H que nous avons HAVE_STRTOD macros actives et donc la fonction strtod fonctionne avec succès et nous n'avons aucune erreur.

ÉDITÉ N1

Si vous ajoutez à votre chaîne #define HAVE_STRTOD 1 fichier config.h alors tout fonctionne parfaitement.

+0

Maintenant nous nous rapprochons un peu! Alors qu'est-ce que CF? et pourquoi l'ajout de répertoires supplémentaires entraînera une erreur de validation? –

+0

'CF' est une variable contenant des drapeaux de compilateur. Ajouter des includes ne change pas beaucoup (tant qu'il compile encore).Aussi 'PIC' n'est pas pertinent pour vous (seulement pour les DLL). Je suppose que le 'HAVE_CONFIG_H' change beaucoup (voir' src/stdsoap2.h' lignes 197ff). Mais je ne peux pas vérifier c'est la raison de vos problèmes encore ... – m8mble

+0

@OlegGopkolov Merci. –