2015-04-26 40 views
1

我想写一个简单的hello世界gsoap示例。我也包含了http_get插件。当我编译使用:Gsoap汇编

g++ RestService.cpp soapC.cpp soapRestServiceSoap12Service.cpp -o server.exe -lgsoap++ 

我得到follwing错误:

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 

回答

1

我假定这两个RestService.cppsoapRestServiceSoap12Service.cpp在他们的头有#include soapRestServiceSoap12Service.h所以你在httpget.c中有一些函数的双重定义。您可以检查here以了解类似的问题。

最好不要在头文件中包含.cpp.c文件。我猜你可以尝试删除soapRestServiceSoap12Service.cpp中的#include "httpget.c",然后在编译时,只需添加httpget.c源文件。

例如

g++ httpget.c RestService.cpp soapC.cpp soapRestServiceSoap12Service.cpp -o server.exe -lgsoap++