c++ - 使用 automake 构建 gSoap 应用程序时的不同行为

标签 c++ automake gsoap

我们使用 gSoap 开发了一个简单的 C++ 应用程序。当我们使用经典的 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 

生成文件

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

更新:完整源代码可用 here

最佳答案

万恶的根源是由 autoconf 工具生成的 config.h 文件。查看你的 Makefile 的CF var。如果添加 -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 变体相同的错误

已编辑 查看 stdsoap2.cpp 文件中的 soap_s2double 函数。如果我们激活 HAVE_CONFIG_H 宏(通过 -DHAVE_CONFIG_H 选项),它又会停用 HAVE_STRTOD 宏(查看 stdsoap2.h 文件)。结果我们遇到了 SOAP_TYPE 错误(因为我们无法将 risk 变量的字符串值转换为 double)。如果我们在没有 HAVE_CONFIG_H 宏的情况下工作,则我们有 HAVE_STRTOD 事件宏,因此 strtod 函数可以成功工作,并且不会出现任何错误。

已编辑的 N1

如果您将 #define HAVE_STRTOD 1 字符串添加到您的 config.h 文件中,那么一切都会完美运行。

关于c++ - 使用 automake 构建 gSoap 应用程序时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32718104/

相关文章:

c - 如何在C中使用gSOAP创建soap_dom_element并将其分配给__any?

java - 无法读取在 C++ 中序列化的 Java 数据

c++ - QTableView列宽可调

c - 在使用 autotools 编译的项目上运行 valgrind 输出多个堆摘要

c++ - gSOAP:RPC 截断 std::string 中的二进制数据

c - ONVIF WS-Discover 1.0 - 客户端和事件处理程序

c++ - 我怎样才能在 wxWidgets 中找到一个 sizer?

c++ - "#using"需要 C++/CLI 模式

c++ - 如何用GNU的autoconf和automake打包数据文件

c - ISC-DHCP,在配置脚本中定义新 token