Разное поведение при использовании automake для создания приложения gSoap

Мы разработали простое приложение на C++ с использованием gSoap . Когда мы используем классический Makefile, все в порядке, и система работает нормально. Но когда мы используем GNU autotools в качестве системы сборки, мы сталкиваемся со странной ошибкой проверки нарушения ограничений при вызове сервиса:

( 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 и 2.8.23 и скомпилировали с помощью g++-4.7. Служба генерируется с помощью следующей команды:

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

ОБНОВЛЕНИЕ: полный источник доступен здесь

1 ответ

Решение

Корнем зла является файл config.h, который генерируется инструментами autoconf. смотреть на CF вар 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

Отредактированный взгляд на soap_s2double функция в файле stdsoap2.cpp. Если мы активируем HAVE_CONFIG_H макросы (через параметр -DHAVE_CONFIG_H), которые он, в свою очередь, деактивирует HAVE_STRTOD макросы (смотрите файл stdsoap2.h). В результате мы имеем ошибку SOAP_TYPE (потому что мы не можем преобразовать строковое значение risk Вар, чтобы удвоить). Если мы работаем без HAVE_CONFIG_H макросы, которые у нас есть HAVE_STRTOD активные макросы и, следовательно, strtod Функция работает успешно, и у нас нет ошибок.

ИЗДАНИЕ N1

Если вы добавите #define HAVE_STRTOD 1 Строка в ваш файл config.h, тогда все будет работать отлично.

Другие вопросы по тегам