2015-09-22 19 views
2

我们使用gSoap开发了一个简单的C++应用程序。当我们使用经典的Makefile时,一切正常,系统工作正常。但是,当我们使用GNU自动工具作为构建系统,我们遇到一个奇怪的约束违反验证错误,当我们拨打服务:automake用于构建gSoap应用程序时的不同行为

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

我们已经检查了所有的编译和类似标志和看起来都一样。

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 

我们已经产生使用2.8.9和23年2月8日的服务和编译G ++ - 4.7。该服务使用以下命令生成:

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

UPDATE:完整的源代码可以here

+0

你在另一台机器上试过这个吗? – ZivS

+0

客户端发送的xml消息是怎样的?他们是一样的吗? –

+0

@ZivS这里的结果相同。我可以在我的机器上使用自动工具重现相同的错误(Debian 8.1) –

回答

1

邪恶的根源是由autoconf的工具生成的config.h文件。看看CF var your Makefile。如果添加-DHAVE_CONFIG_H -I. -I..即你的CF将

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

那么你将有同样的错误在编译

的automake的变种EDITED 看在stdsoap2.cpp文件soap_s2double功能。如果我们激活HAVE_CONFIG_H宏(通过-DHAVE_CONFIG_H选项),它会依次取消激活HAVE_STRTOD宏(请参见stdsoap2.h文件)。因此,我们有SOAP_TYPE错误(因为我们无法将risk var的字符串值转换为double)。如果我们的工作没有HAVE_CONFIG_H宏我们有HAVE_STRTOD活动宏,因此strtod函数工作成功,我们没有任何错误。

EDITED N1

如果添加#define HAVE_STRTOD 1串到你的config.h文件,那么一切都将正常工作。

+0

现在我们接近一点!那么什么是CF?为什么添加更多include目录会导致验证错误? –

+0

'CF'是一个包含编译器标志的变量。添加包含不会有太大改变(只要它仍然在编译)。另外'PIC'与你无关(仅适用于dll)。我猜''HAVE_CONFIG_H'会改变很多(参见'src/stdsoap2.h'行197ff)。但我无法验证这是你的问题的原因呢... – m8mble

+0

@OlegGopkolov谢谢。 –

相关问题