views:

117

answers:

2

I'm trying to get a simple example working using gSoap, for VS2008.

I've done the following:

wsdl2h -o Init.h http://myservices/InitalisationService.asmx?WSDL

And then this:

soapcpp2 -I "C:\3pSDK\gsoap-2.7\gsoap\import" -i -C -limport Init.h

which produces many files. My project folder looks like this:

// generated files
Init.h
InitalisationServiceSoap.initalizePlayer.req.xml
InitalisationServiceSoap.initalizePlayer.res.xml
InitalisationServiceSoap.nsmap
InitalisationServiceSoap12.initalizePlayer.req.xml
InitalisationServiceSoap12.initalizePlayer.res.xml
InitalisationServiceSoap12.nsmap
ortC.cpp
ortH.h
ortInitalisationServiceSoap12Proxy.cpp
ortInitalisationServiceSoap12Proxy.h
ortInitalisationServiceSoapProxy.cpp
ortInitalisationServiceSoapProxy.h
ortMatlab.c
ortMatlab.h
ortStub.h

// Project Files
ReadMe.txt
stdafx.cpp
stdafx.h
WebServicesClient.cpp
WebServicesClient.vcproj
targetver.h

// files added to the project from gSoap folder
stdsoap2.cpp
stdsoap2.h
typemap.dat

When I build, I get a lot of linker errors (unresolved externals). I can't find anything to link against (e.g. no binary libraries) - what am I missing?

I believe that this may have something to do with the following from the docs:

To complete the build, compile and link the generated soapC.cpp, soapcalcProxy.cpp, and the run-time gSOAP engine -lgsoap++ (or use source stdsoap2.cpp in case libgsoap++.a is not installed) with your code.

is there a gsoap++ library for win32?

1>Compiling...

1>WebServicesClient.cpp 1>ortC.cpp 1>Generating Code... 1>Linking... 1>stdsoap2.obj : error LNK2019: unresolved external symbol _soap_faultcode referenced in function _http_response 1>stdsoap2.obj : error LNK2001: unresolved external symbol _namespaces 1>stdsoap2.obj : error LNK2019: unresolved external symbol _soap_getheader referenced in function _soap_recv_header 1>stdsoap2.obj : error LNK2019: unresolved external symbol _soap_faultsubcode referenced in function _soap_set_fault 1>stdsoap2.obj : error LNK2019: unresolved external symbol _soap_faultstring referenced in function _soap_set_fault 1>stdsoap2.obj : error LNK2019: unresolved external symbol _soap_putfault referenced in function _soap_send_fault 1>stdsoap2.obj : error LNK2019: unresolved external symbol _soap_putheader referenced in function _soap_send_fault 1>stdsoap2.obj : error LNK2019: unresolved external symbol _soap_serializefault referenced in function _soap_send_fault 1>stdsoap2.obj : error LNK2019: unresolved external symbol _soap_serializeheader referenced in function _soap_send_fault 1>stdsoap2.obj : error LNK2019: unresolved external symbol _soap_getfault referenced in function _soap_recv_fault 1>stdsoap2.obj : error LNK2019: unresolved external symbol _soap_faultdetail referenced in function _soap_set_error 1>ortC.obj : error LNK2019: unresolved external symbol "void * __cdecl soap_class_id_enter(struct soap *,char const *,void *,int,unsigned int,char const *,char const *)" (?soap_class_id_enter@@YAPAXPAUsoap@@PBDPAXHI11@Z) referenced in function "class std::basic_string,class std::allocator > * __cdecl soap_in_std__string(struct soap *,char const *,class std::basic_string,class std::allocator > *,char const *)" (?soap_in_std__string@@YAPAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAUsoap@@PBDPAV12@1@Z) 1>ortC.obj : error LNK2019: unresolved external symbol "int __cdecl soap_putindependent(struct soap *)" (?soap_putindependent@@YAHPAUsoap@@@Z) referenced in function "int __cdecl soap_put_std__string(struct soap *,class std::basic_string,class std::allocator > const *,char const *,char const *)" (?soap_put_std__string@@YAHPAUsoap@@PBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PBD2@Z) 1>ortC.obj : error LNK2019: unresolved external symbol "int __cdecl soap_getindependent(struct soap *)" (?soap_getindependent@@YAHPAUsoap@@@Z) referenced in function "class std::basic_string,class std::allocator > * __cdecl soap_get_std__string(struct soap *,class std::basic_string,class std::allocator > *,char const *,char const *)" (?soap_get_std__string@@YAPAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAUsoap@@PAV12@PBD2@Z) 1>ortC.obj : error LNK2019: unresolved external symbol "int __cdecl soap_fdelete(struct soap_clist *)" (?soap_fdelete@@YAHPAUsoap_clist@@@Z) referenced in function "class std::basic_string,class std::allocator > * __cdecl soap_instantiate_std__string(struct soap *,int,char const *,char const *,unsigned int *)" (?soap_instantiate_std__string@@YAPAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAUsoap@@HPBD1PAI@Z) 1>ortC.obj : error LNK2019: unresolved external symbol "void __cdecl soap_default_int(struct soap *,int *)" (?soap_default_int@@YAXPAUsoap@@PAH@Z) referenced in function "public: virtual void __thiscall ns1_initalizePlayerResponse::soap_default(struct soap *)" (?soap_default@ns1_initalizePlayerResponse@@UAEXPAUsoap@@@Z) 1>ortC.obj : error LNK2019: unresolved external symbol "int __cdecl soap_out_int(struct soap *,char const *,int,int const *,char const *)" (?soap_out_int@@YAHPAUsoap@@PBDHPBH1@Z) referenced in function "int __cdecl soap_out_ns1_initalizePlayerResponse(struct soap *,char const *,int,class ns1_initalizePlayerResponse const *,char const *)" (?soap_out_ns1_initalizePlayerResponse@@YAHPAUsoap@@PBDHPBV_ns1__initalizePlayerResponse@@1@Z) 1>ortC.obj : error LNK2019: unresolved external symbol "int __cdecl soap_ignore_element(struct soap *)" (?soap_ignore_element@@YAHPAUsoap@@@Z) referenced in function "class ns1_initalizePlayerResponse * __cdecl soap_in_ns1_initalizePlayerResponse(struct soap *,char const *,class ns1_initalizePlayerResponse *,char const *)" (?soap_in_ns1_initalizePlayerResponse@@YAPAV_ns1__initalizePlayerResponse@@PAUsoap@@PBDPAV1@1@Z) 1>ortC.obj : error LNK2019: unresolved external symbol "int * __cdecl soap_in_int(struct soap *,char const *,int *,char const *)" (?soap_in_int@@YAPAHPAUsoap@@PBDPAH1@Z) referenced in function "class ns1_initalizePlayerResponse * __cdecl soap_in_ns1_initalizePlayerResponse(struct soap *,char const *,class ns1_initalizePlayerResponse *,char const *)" (?soap_in_ns1_initalizePlayerResponse@@YAPAV_ns1__initalizePlayerResponse@@PAUsoap@@PBDPAV1@1@Z) 1>G:\Prototypes\WebServicesClient\Debug\WebServicesClient.exe : fatal error LNK1120: 19 unresolved externals 1>Build log was saved at "file://g:\Prototypes\WebServicesClient\WebServicesClient\Debug\BuildLog.htm" 1>WebServicesClient - 20 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

+1  A: 

If I remember correctly, you need to link against a libgsoap.lib (or similar). To find it, search for libs in your gSOAP installation folder.

Edit: It should be in the same directory (or close) as the stdsoap.h / stdsoap.cpp files.

utnapistim
great stuff, thanks. I did hunt for such a lib, but I couldn't find one. I'll try to download another distribution. The distribution I got has a bin folder for win32, but no libs.
freefallr
there's definitely no .lib to link to.
freefallr
A: 

Okay, for those frustrated with the docs on the gSoap site, using VS2008 to compile a quick client only example, here's the steps (servers are different).

Generate the header file from the WSDL: wsdl2h -o Init.h http://bleh.com/myservice.asmx?WSDL

Generate the soap client files:

soapcpp2 -C -IC:\3pSDK\gsoap-2.7\gsoap\import Init.h

Ensure you add the following files to your solution for build:

soapC.cpp, soapClient.cpp, and stdsoap2.cpp

Ensure that, for each of these files, you select the compiler option "Not using Pre-Compiled headers". (file Properties -> C++ -> Precompiled Headers -> Create/Use Precompiled header).

Finally, add the .nsmap file generated for your proxy to the stdafx.h (or in your main if your project isn't using pre-compiled headers).

Here's a sample that makes a simple query:

// WebServicesClient.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "init/soapInitServiceSoapProxy.h"

#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
std::string user = "AAAA";
std::string pass = "BBBB";

InitServiceSoap             service;    

_ns1__initPlayer            query;
_ns1__initPlayerResponse    ans;

query.psParam1 = &user;
query.psParam2 = &pass; 

if( service.__ns2__initPlayer(&query, &ans) == SOAP_OK )
{
    cout << "success!" << endl;     
}

cin.get();

return 0;
}

hope this helps someone!

freefallr