Gsoap编译
Gsoap compilation
我正在尝试编写一个简单的 hello world gsoap 示例。我也包含了 http_get
插件。当我使用 :
编译时
g++ RestService.cpp soapC.cpp soapRestServiceSoap12Service.cpp -o server.exe -lgsoap++
我收到以下错误:
soapRestServiceSoap12Service.cpp:(.text+0x0): multiple definition of `soap_encode_string'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x0): first defined here
/tmp/cc9vrCVB.o: In function `soap_decode_string':
soapRestServiceSoap12Service.cpp:(.text+0x138): multiple definition of `soap_decode_string'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x138): first defined here
/tmp/cc9vrCVB.o: In function `http_get':
soapRestServiceSoap12Service.cpp:(.text+0x162c): multiple definition of `http_get'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x5fe): first defined here
/tmp/cc9vrCVB.o: In function `query_val':
soapRestServiceSoap12Service.cpp:(.text+0x141a): multiple definition of `query_val'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x3ec): first defined here
/tmp/cc9vrCVB.o: In function `query_key':
soapRestServiceSoap12Service.cpp:(.text+0x148e): multiple definition of `query_key'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x460): first defined here
/tmp/cc9vrCVB.o: In function `query':
soapRestServiceSoap12Service.cpp:(.text+0x150c): multiple definition of `query'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x4de): first defined here
/tmp/cc9vrCVB.o: In function `soap_get_connect':
soapRestServiceSoap12Service.cpp:(.text+0x152c): multiple definition of `soap_get_connect'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x4fe): first defined here
/tmp/cc9vrCVB.o:(.rodata+0xc7): multiple definition of `http_get_id'
/tmp/cci3TH4N.o:(.rodata+0x13): first defined here
下面是我的代码
#define soapRestServiceSoap12Service_H
#include "soapH.h"
#include "httpget.h"
#include "httpget.c"
class SOAP_CMAC RestServiceSoap12Service : public soap
{ public:
/// Constructor
RestServiceSoap12Service();
/// Constructor with copy of another engine state
RestServiceSoap12Service(const struct soap&);
/// Constructor with engine input+output mode control
RestServiceSoap12Service(soap_mode iomode);
/// Constructor with engine input and output mode control
RestServiceSoap12Service(soap_mode imode, soap_mode omode);
/// Destructor frees all data
virtual ~RestServiceSoap12Service();
/// Initializer used by constructor
virtual void RestServiceSoap12Service_init(soap_mode imode, soap_mode omode);
/// Create a copy
virtual RestServiceSoap12Service *copy();
/// Force close connection (normally automatic)
virtual int soap_close_socket();
/// Return sender-related fault to sender
virtual int soap_senderfault(const char *string, const char *detailXML);
/// Return sender-related fault with SOAP 1.2 subcode to sender
virtual int soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML);
/// Return receiver-related fault to sender
virtual int soap_receiverfault(const char *string, const char *detailXML);
/// Return receiver-related fault with SOAP 1.2 subcode to sender
virtual int soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML);
/// Print fault
virtual void soap_print_fault(FILE*);
#ifndef WITH_LEAN
/// Print fault to stream
virtual void soap_stream_fault(std::ostream&);
/// Put fault into buffer
virtual char *soap_sprint_fault(char *buf, size_t len);
#endif
/// Disables and removes SOAP Header from message
virtual void soap_noheader();
/// Run simple single-thread iterative service on port until a connection error occurs (returns error code or SOAP_OK), use this->bind_flag = SO_REUSEADDR to rebind for a rerun
virtual int run(int port);
/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)
virtual SOAP_SOCKET bind(const char *host, int port, int backlog);
/// Accept next request (returns socket or SOAP_INVALID_SOCKET)
virtual SOAP_SOCKET accept();
/// Serve this request (returns error code or SOAP_OK)
virtual int serve();
/// Used by serve() to dispatch a request (returns error code or SOAP_OK)
virtual int dispatch();
///
/// Service operations (you should define these):
///
/// Web service operation 'HelloWorld' (returns error code or SOAP_OK)
virtual int HelloWorld(_ns1__HelloWorld *ns1__HelloWorld, _ns1__HelloWorldResponse *ns1__HelloWorldResponse);
/// Web service operation 'OpenAccountBalanceInquiry' (returns error code or SOAP_OK)
virtual int OpenAccountBalanceInquiry(_ns1__OpenAccountBalanceInquiry *ns1__OpenAccountBalanceInquiry, _ns1__OpenAccountBalanceInquiryResponse *ns1__OpenAccountBalanceInquiryResponse);
///HTTP Get Handler
//virtual int http_get_handler(soap *_soap);
int Execute();
private:
struct soap objSoap;
};
#endif
我假设 RestService.cpp
和 soapRestServiceSoap12Service.cpp
在它们的 header 中都有 #include soapRestServiceSoap12Service.h
所以你在 httpget.c
中有一些函数的双重定义.您可以检查 here 是否有类似问题。
最好不要在 header 文件中包含 .cpp
或 .c
文件。我想你可以尝试删除 soapRestServiceSoap12Service.cpp
中的 #include "httpget.c"
然后在你的编译中,只需添加 httpget.c
源文件。
例如
g++ httpget.c RestService.cpp soapC.cpp soapRestServiceSoap12Service.cpp -o server.exe -lgsoap++
我正在尝试编写一个简单的 hello world gsoap 示例。我也包含了 http_get
插件。当我使用 :
g++ RestService.cpp soapC.cpp soapRestServiceSoap12Service.cpp -o server.exe -lgsoap++
我收到以下错误:
soapRestServiceSoap12Service.cpp:(.text+0x0): multiple definition of `soap_encode_string'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x0): first defined here
/tmp/cc9vrCVB.o: In function `soap_decode_string':
soapRestServiceSoap12Service.cpp:(.text+0x138): multiple definition of `soap_decode_string'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x138): first defined here
/tmp/cc9vrCVB.o: In function `http_get':
soapRestServiceSoap12Service.cpp:(.text+0x162c): multiple definition of `http_get'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x5fe): first defined here
/tmp/cc9vrCVB.o: In function `query_val':
soapRestServiceSoap12Service.cpp:(.text+0x141a): multiple definition of `query_val'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x3ec): first defined here
/tmp/cc9vrCVB.o: In function `query_key':
soapRestServiceSoap12Service.cpp:(.text+0x148e): multiple definition of `query_key'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x460): first defined here
/tmp/cc9vrCVB.o: In function `query':
soapRestServiceSoap12Service.cpp:(.text+0x150c): multiple definition of `query'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x4de): first defined here
/tmp/cc9vrCVB.o: In function `soap_get_connect':
soapRestServiceSoap12Service.cpp:(.text+0x152c): multiple definition of `soap_get_connect'
/tmp/cci3TH4N.o:RestService.cpp:(.text+0x4fe): first defined here
/tmp/cc9vrCVB.o:(.rodata+0xc7): multiple definition of `http_get_id'
/tmp/cci3TH4N.o:(.rodata+0x13): first defined here
下面是我的代码
#define soapRestServiceSoap12Service_H
#include "soapH.h"
#include "httpget.h"
#include "httpget.c"
class SOAP_CMAC RestServiceSoap12Service : public soap
{ public:
/// Constructor
RestServiceSoap12Service();
/// Constructor with copy of another engine state
RestServiceSoap12Service(const struct soap&);
/// Constructor with engine input+output mode control
RestServiceSoap12Service(soap_mode iomode);
/// Constructor with engine input and output mode control
RestServiceSoap12Service(soap_mode imode, soap_mode omode);
/// Destructor frees all data
virtual ~RestServiceSoap12Service();
/// Initializer used by constructor
virtual void RestServiceSoap12Service_init(soap_mode imode, soap_mode omode);
/// Create a copy
virtual RestServiceSoap12Service *copy();
/// Force close connection (normally automatic)
virtual int soap_close_socket();
/// Return sender-related fault to sender
virtual int soap_senderfault(const char *string, const char *detailXML);
/// Return sender-related fault with SOAP 1.2 subcode to sender
virtual int soap_senderfault(const char *subcodeQName, const char *string, const char *detailXML);
/// Return receiver-related fault to sender
virtual int soap_receiverfault(const char *string, const char *detailXML);
/// Return receiver-related fault with SOAP 1.2 subcode to sender
virtual int soap_receiverfault(const char *subcodeQName, const char *string, const char *detailXML);
/// Print fault
virtual void soap_print_fault(FILE*);
#ifndef WITH_LEAN
/// Print fault to stream
virtual void soap_stream_fault(std::ostream&);
/// Put fault into buffer
virtual char *soap_sprint_fault(char *buf, size_t len);
#endif
/// Disables and removes SOAP Header from message
virtual void soap_noheader();
/// Run simple single-thread iterative service on port until a connection error occurs (returns error code or SOAP_OK), use this->bind_flag = SO_REUSEADDR to rebind for a rerun
virtual int run(int port);
/// Bind service to port (returns master socket or SOAP_INVALID_SOCKET)
virtual SOAP_SOCKET bind(const char *host, int port, int backlog);
/// Accept next request (returns socket or SOAP_INVALID_SOCKET)
virtual SOAP_SOCKET accept();
/// Serve this request (returns error code or SOAP_OK)
virtual int serve();
/// Used by serve() to dispatch a request (returns error code or SOAP_OK)
virtual int dispatch();
///
/// Service operations (you should define these):
///
/// Web service operation 'HelloWorld' (returns error code or SOAP_OK)
virtual int HelloWorld(_ns1__HelloWorld *ns1__HelloWorld, _ns1__HelloWorldResponse *ns1__HelloWorldResponse);
/// Web service operation 'OpenAccountBalanceInquiry' (returns error code or SOAP_OK)
virtual int OpenAccountBalanceInquiry(_ns1__OpenAccountBalanceInquiry *ns1__OpenAccountBalanceInquiry, _ns1__OpenAccountBalanceInquiryResponse *ns1__OpenAccountBalanceInquiryResponse);
///HTTP Get Handler
//virtual int http_get_handler(soap *_soap);
int Execute();
private:
struct soap objSoap;
};
#endif
我假设 RestService.cpp
和 soapRestServiceSoap12Service.cpp
在它们的 header 中都有 #include soapRestServiceSoap12Service.h
所以你在 httpget.c
中有一些函数的双重定义.您可以检查 here 是否有类似问题。
最好不要在 header 文件中包含 .cpp
或 .c
文件。我想你可以尝试删除 soapRestServiceSoap12Service.cpp
中的 #include "httpget.c"
然后在你的编译中,只需添加 httpget.c
源文件。
例如
g++ httpget.c RestService.cpp soapC.cpp soapRestServiceSoap12Service.cpp -o server.exe -lgsoap++