gSoap -> Calculation Beispiel -> LINKER Fehler



  • Hallo zusammen

    Um gSoap (v2.8.2) besser kennen zu lernen, habe ich das calculation Beispiel in der README Datei probiert zu programmieren.
    Wie dort erklärt wird bezieht man über den Internetlink das WSDL File und generiert daraus das Header File. Dieses enthält dann die relevanten SOAP Schnittstellenmethoden, um Beispielsweise zwei Zahlen zu addieren.
    Das Header file wird danach mit dem 'soapcpp2' Compiler weiterverarbeitet, um sich seine Server-Client Architektur zu generieren. Das funktioniert soweit auch alles wunderbar. Danach kreiere ich in Visual Studio 2010 ein neues leeres C++ Projekt. Im README File ist genau erklärt, welche Dateien es benötigt um zu Programmieren. Ich selber wollte den Serverteil versuchen und habe folgende Files dem Projekt hinzugefügt:

    HEADER Files:
    - calc.nsmap
    - soapH.h
    - soapServer.h
    - soapStub.h
    - stdsoap2.h

    Source Files:
    - main.cpp (Eintrittspunkt)
    - soapC.cpp
    - soapServer.cpp
    - stdsoap2.cpp

    Unter den Projekteigenschaften habe ich bei 'Additional Include Direcotries' den Pfad zu den generierten SOAP Dateien. Bei den Linker Optionen habe ich noch die benötigte ws2_32.lib angegeben. Im 'main.cpp' habe ich folgende includes getätigt:

    #include <stdio.h>
    #include "soapH.h"
    #include "calc.nsmap"

    Will ich nun so das Projekt kompilieren, dann erhalte ich LINKER Fehler und zwar folgende:

    Error 28 error LNK1120: 5 unresolved externals C:\Users\Marius\documents\visual studio 2010\Projects\GSoapExample\Debug\GSoapExample.exe GSoapExample

    Error 1 error LNK2019: unresolved external symbol "int __cdecl ns2__add(struct soap *,double,double,double &)" (?ns2__add@@YAHPAUsoap@@NNAAN@Z) referenced in function "int __cdecl soap_serve_ns2__add(struct soap *)" (?soap_serve_ns2__add@@YAHPAUsoap@@@Z) C:\Users\Marius\Documents\Visual Studio 2010\Projects\GSoapExample\GSoapExample\soapServer.obj GSoapExample

    Error 4 error LNK2019: unresolved external symbol "int __cdecl ns2__div(struct soap *,double,double,double &)" (?ns2__div@@YAHPAUsoap@@NNAAN@Z) referenced in function "int __cdecl soap_serve_ns2__div(struct soap *)" (?soap_serve_ns2__div@@YAHPAUsoap@@@Z) C:\Users\Marius\Documents\Visual Studio 2010\Projects\GSoapExample\GSoapExample\soapServer.obj GSoapExample

    ...

    Insgesamt sind es 5 solche Linkerfehler. Ich habe dann unter MSDN versucht das Problem zu lokalisieren. Auch diverse GOOGLE Recherchen haben mich nicht auf die Lösung geführt von diesem Problem. Teilweise wurde das genau selber angesprochen, aber nicht wirklich eine Lösung erarbeitet. Irgendwie fehlt mir doch noch irgendwelche Libraries für den LINKER oder sonst irgendwelche Definitionen. Ich weiss aber nicht welche und wo ich die finde.
    Falls ich beim Projekt anstatt den Server den Client einfüge, dann kompiliert das Projekt ohne Probleme. Im 'soapServer.cpp' File is Beispielsweise folgende Methode deklariert:

    SOAP_FMAC5 int SOAP_FMAC6 soap_serve_ns2__add(struct soap *soap)
    {	struct ns2__add soap_tmp_ns2__add;
    	struct ns2__addResponse soap_tmp_ns2__addResponse;
    	soap_default_ns2__addResponse(soap, &soap_tmp_ns2__addResponse);
    	soap_default_ns2__add(soap, &soap_tmp_ns2__add);
    	soap->encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/";
    	if (!soap_get_ns2__add(soap, &soap_tmp_ns2__add, "ns2:add", NULL))
    		return soap->error;
    	if (soap_body_end_in(soap)
    	 || soap_envelope_end_in(soap)
    	 || soap_end_recv(soap))
    		return soap->error;
    	soap->error = ns2__add(soap, soap_tmp_ns2__add.a, soap_tmp_ns2__add.b, soap_tmp_ns2__addResponse.result);
    	if (soap->error)
    		return soap->error;
    	soap_serializeheader(soap);
    	soap_serialize_ns2__addResponse(soap, &soap_tmp_ns2__addResponse);
    	if (soap_begin_count(soap))
    		return soap->error;
    	if (soap->mode & SOAP_IO_LENGTH)
    	{	if (soap_envelope_begin_out(soap)
    		 || soap_putheader(soap)
    		 || soap_body_begin_out(soap)
    		 || soap_put_ns2__addResponse(soap, &soap_tmp_ns2__addResponse, "ns2:addResponse", NULL)
    		 || soap_body_end_out(soap)
    		 || soap_envelope_end_out(soap))
    			 return soap->error;
    	};
    	if (soap_end_count(soap)
    	 || soap_response(soap, SOAP_OK)
    	 || soap_envelope_begin_out(soap)
    	 || soap_putheader(soap)
    	 || soap_body_begin_out(soap)
    	 || soap_put_ns2__addResponse(soap, &soap_tmp_ns2__addResponse, "ns2:addResponse", NULL)
    	 || soap_body_end_out(soap)
    	 || soap_envelope_end_out(soap)
    	 || soap_end_send(soap))
    		return soap->error;
    	return soap_closesock(soap);
    }
    

    Kommentiere ich diese aus, so geht der Linker Fehler weg was wahrscheindlich nicht weiter verwunderlich ist. Fehlt da demfall irgendwo noch Methoden Definitionen welche noch irgendwo anders verwendet werden oder noch nicht bekannt sind? Wer weiss da weiter?

    Mit freundlichen Grüssen



  • Ich habe leider den Fehler nicht lokalisieren können. Habe danach das Hello Example aus dem gSoap Ordner ausprobiert. Dort konnte ich mit erfolg eine Multithreaded Soap Server/client Architektur erstellen. Falls jemand doch noch was zum obigen Problem weiss, würde es mich trotzdem interessieren.

    Mit freundlichen Grüssen


Anmelden zum Antworten