Axis C++ example

  • Hallo ,
    ich hab mich mit Axis C++ und dem calculator beispiel beschäftigt und habe einige Probleme. Ich hab hier mal die Probleme auf englisch verfasst, hoffe ihr könnt trotzdem damit was anfangen;)

    Hi all,
    i have some problems with the Axis c++ calculator-example. I build my Client with
    g++ c.cpp -I$AXISCPP_HOME/include -I$AXISCPP_HOME/lib -ldl -laxiscpp_client -o calculator and
    i get the error: "cannot find laxiscpp_client". I search in the mailing list for this problem and change my command to:
    g++ c.cpp -I$AXISCPP_HOME/include -I$AXISCPP_HOME/lib -ldl -L<PathToTheLibrary>laxis_client.so -o calculator
    Now i think it finds the library but i get the error "undefined reference to 'Calculator::Calculator()' "
    I have search in the mailing list but all tipps don´t solve this problem.
    I use Open Suse 10.3,compiler version 4.2.1 and try it with KDE/KDevelop too, but it produces the same error.
    I think i have set the LD_LIBRARY_PATH correctly. Maybe there is a conflict with 32 and 64 bit processor.
    Can anybody help me please?
    After i can´t solve this problem i go on with the server guide. I run the simle Axis Server with:
    ./simple_axis_server 8080 and then deploy the service with:
    java org.apache.axis.client.AdminClient -Lhttp://localhost:8080/axis/Services/AdminService deploy.wsdd
    I get the message: "Porcessing file deploy.wsdd"
    Was the deploying successful or not?
    By checking the deploying configuration in the user server guide:Open a browser and enter the link http://localhost/axis
    I can´t open the link. Why it doesn´t work??
    I hope there is somebody who can help me in some questions...

  • Now i think it finds the library but i get the error "undefined reference to 'Calculator::Calculator()' "


    Da hast du wohl in der Klasse Calculator einen parameterlosen Konstruktor für Calculator deklariert, und rufst ihn auch auf, aber du hast keine Definition angegeben.

    *plantsch*

  • hi, das problem ist, dass die Dateien calculator.cpp und calculator.hpp automatisch mit dem wsdl2ws-Tool generiert werden und die Deklarationen und Definitionen der De- und Konstruktoren beinhalten. An diesen Dateien dürfte man eigentlich nach Tutorial nichts verändern...Es handelt sich auch(glaub ich) um einen Linker Fehler und keinen Compile Fehler...Ich hab das Beispiel auch unter Visual Studo 2003.net probiert und da kommen auch ähnliche Fehler, die ich nicht lösen konnte...So ist schonmal aussgeschlossen dass es was mit der Platfom Windows und Linux zu tun hat. Zudem weiss ich nicht was der zusatz -ldl im Linux befehl macht. Trotzdem danke für die Antwort Planschkuh=) Hat irgendjemand mal das axis c++ beispiel ausprobiert? Kann mir jemand helfen?
    lg

  • hi, das problem ist, dass die Dateien calculator.cpp und calculator.hpp automatisch mit dem wsdl2ws-Tool generiert werden und die Deklarationen und Definitionen der De- und Konstruktoren beinhalten.


    Ist der Code kurz genug, um hier gepostet zu werden?

    Zitat

    Es handelt sich auch(glaub ich) um einen Linker Fehler und keinen Compile Fehler...


    Ja. Hat auch keiner was gegenteiliges gesagt. Der Code versucht, einen Konstruktor aufzurufen, aber der Linker findet die Definition dieses Konstruktors nicht.

    Zitat

    Zudem weiss ich nicht was der zusatz -ldl im Linux befehl macht.


    Bindet eine bestimmte Library, die libdl, ein. Damit kann man dynamisch Libraries laden. Was vielleicht auch was mit deinem Problem zu tun hat.

    *plantsch*

  • hi,
    so hier mal die cpp-datei

    -----------------------------------------------------------------------
    /*
    * This file was auto-generated by the Axis C++ Web Service Generator (WSDL2Ws)
    * This file contains Client Stub implementation for remote web service.
    */
    #include "Calculator.hpp"
    #include <axis/AxisWrapperAPI.hpp>
    #include <axis/Axis.hpp>
    #include <string.h>
    using namespace std;
    Calculator::Calculator(const char* pchEndpointUri, AXIS_PROTOCOL_TYPE eProtocol)
    :Stub(pchEndpointUri, eProtocol)
    {
    }
    Calculator::Calculator()
    :Stub(" ", APTHTTP1_1)
    {
    m_pCall->setEndpointURI("http://localhost/axis/Calculator");
    }
    Calculator::~Calculator()
    {
    }

    /*Methods corresponding to the web service methods*/
    /*
    * This method wrap the service method add
    */
    xsd__int Calculator::add(xsd__int Value0, xsd__int Value1)
    {
    xsd__int Ret = 0;
    const char * pcCmplxFaultName = NULL;
    try
    {
    if( AXIS_SUCCESS != m_pCall->initialize( CPP_RPC_PROVIDER))
    {
    return Ret;
    }
    if( NULL == m_pCall->getTransportProperty( "SOAPAction", false))
    {
    m_pCall->setTransportProperty( SOAPACTION_HEADER,
    "Calculator#add");
    }
    m_pCall->setSOAPVersion( SOAP_VER_1_1);
    m_pCall->setOperation( "add", "http://localhost/axis/Calculator");
    applyUserPreferences();
    m_pCall->addParameter( (void *) &Value0, "in0", XSD_INT);
    m_pCall->addParameter( (void *) &Value1, "in1", XSD_INT);
    if( AXIS_SUCCESS == m_pCall->invoke())
    {
    if( AXIS_SUCCESS == m_pCall->checkMessage( "addResponse",
    "http://localhost/axis/Calculator"))
    {
    xsd__int * pReturn = m_pCall->getElementAsInt( "addReturn", 0);
    if( pReturn)
    {
    Ret = *pReturn;
    Axis::AxisDelete( (void *) pReturn, XSD_INT);
    }
    }
    }
    m_pCall->unInitialize();
    return Ret;
    }
    catch( AxisException& e)
    {
    int iExceptionCode = e.getExceptionCode();
    if( AXISC_NODE_VALUE_MISMATCH_EXCEPTION != iExceptionCode)
    {
    throw SoapFaultException( e);
    }
    ISoapFault * pSoapFault = (ISoapFault *) m_pCall->checkFault( "Fault",
    "http://localhost/axis/Calculator");
    if( pSoapFault)
    {
    m_pCall->unInitialize();
    throw SoapFaultException( e);
    }
    else
    {
    throw;
    }
    }
    }
    -----------------------------------------------------------------------

    und hier die .hpp-Datei:
    -----------------------------------------------------------------------

    /*
    * This file was auto-generated by the Axis C++ Web Service Generator (WSDL2Ws)
    * This file contains Client Stub Class for remote web service
    */
    #if !defined(__CALCULATOR_CLIENTSTUB_H__INCLUDED_)
    #define __CALCULATOR_CLIENTSTUB_H__INCLUDED_
    #include <axis/client/Stub.hpp>
    #include <axis/SoapFaultException.hpp>
    #include <axis/ISoapFault.hpp>
    AXIS_CPP_NAMESPACE_USE
    class Calculator :public Stub
    {
    public:
    STORAGE_CLASS_INFO Calculator(const char* pchEndpointUri, AXIS_PROTOCOL_TYPE eProtocol=APTHTTP1_1);
    STORAGE_CLASS_INFO Calculator();
    public:
    STORAGE_CLASS_INFO virtual ~Calculator();
    public:
    STORAGE_CLASS_INFO xsd__int add(xsd__int Value0, xsd__int Value1);
    STORAGE_CLASS_INFO xsd__int sub(xsd__int Value0, xsd__int Value1);
    STORAGE_CLASS_INFO xsd__int mul(xsd__int Value0, xsd__int Value1);
    STORAGE_CLASS_INFO xsd__int div(xsd__int Value0, xsd__int Value1);
    };
    #endif /* !defined(__CALCULATOR_CLIENTSTUB_H__INCLUDED_)*/

    -----------------------------------------------------------------------

    weiss nicht ob das weiter hilft. Diese Stubs Klasssen werden von der Axis Engine automatisch generiert und laut tutorial braucht an diesen Dateien nix geändert werden. Meine main sieht etwa so aus:

    #include "Calculator.h"
    #include <stdio.h>
    using namespace std;
    int main()
    {
    Calculator test;
    return 0;
    }

    allein das führt schon zum Fehler. Lass ich die Zeile "Calculator test" raus, tritt der Fehler nicht mehr auf...vielleicht hat ja jemand die Lösung..
    und danke für die schnelle antwort..

  • so nochmal bisl leserlicher;)
    so hier mal die cpp-datei




    und hier die .hpp-Datei:




    weiss nicht ob das weiter hilft. Diese Stubs Klasssen werden von der Axis Engine automatisch generiert und laut tutorial braucht an diesen Dateien nix geändert werden. Meine main sieht etwa so aus:

    Code
    [size=10][size=10]#include "Calculator.h"[/SIZE]
    [size=10]#include <stdio.h>[/SIZE]
    [size=10]using namespace std;[/SIZE]
    [size=10]int main()[/SIZE]
    [size=10]{[/SIZE]
    [size=10]Calculator test;[/SIZE]
    [size=10]return 0;[/SIZE]
    [size=10]}[/SIZE]
    [/SIZE]



    allein das führt schon zum Fehler. Lass ich die Zeile "Calculator test" raus, tritt der Fehler nicht mehr auf...vielleicht hat ja jemand die Lösung..
    und danke für die schnelle antwort..

  • Dieses letzte Codestück mit main ist deine c.cpp? Dann ist klar, daß das so nicht funktionieren kann. In diesem Programm ist ja tatsächlich keine Definition von Calculator::Calculator()!

    Du mußt sowohl c.cpp als auch calculator.cpp kompilieren und zusammenlinken. Etwa, indem du dem Compiler beide auf der Kommandozeile übergibst. Oder beide getrennt mit dem Flag -c kompilierst, dann kommen c.o und calculator.o raus, und die kannst du mit g++ c.o calculator.o -o calculator zu einem Gesamtprogramm zusammenlinken.

    *plantsch*

  • Also ich dachte das in der main Datei keine Defintion von Calculator sein muss, deshalb binde ich ja auch die Header-Datei Calculator.hpp ein. Zudem hab ich mal ein einfachen Beispiel programmiert

    Code
    [size=10]class VersionPortType[/SIZE]
    [size=10]{[/SIZE]
    [size=10]public: VersionPortType();[/SIZE]
    [size=10]~VersionPortType();[/SIZE]
    [size=10]void getVersion();[/SIZE]
    [size=10]};[/SIZE]
     
    [size=10]#endif[/SIZE]



    meine Main Datei sieht so aus:



    so in dieser main Datei hab ich auch keine Definition der Klasse aber es lässt sich einwandfrei compilieren und linken..
    Kannst du ansonsten nochmal die Linux befehle zum compileren und linken genau nennen mit der richtigen reihenfolge? Bin nämlich eher an windows gewöhnt.. trotzdem thanks

    gruss

  • Das ist zumindest für die Basics genauso wie unter Windows, nur dass du g++ statt cl schreibst und "-" statt "/".

    PS Verwendest du tatsächlich keine Einrückungen?

    EDIT: Allgemein, wenn du zwei Module a.cpp und b.cpp hast, machst du:

    Code
    g++ -c a.cpp
    g++ -c b.cpp
    g++ -o <executable-name> a.o b.o

    Einmal editiert, zuletzt von Ringding (19. August 2008 um 11:30)

  • Doch normalerweise verwende ich Einrückungen. Das liegt irgendwo an den KDevelop einstellungen, dass diese nicht automatisch gemacht werden=)
    Ja die drei Compilier- und Linkzeilen hab ich verstanden, aber wenn ich jetzt mal die beiden Programme vergleiche gibt es von der Struktur ja keinen wesentlichen unterschied...Ausserdem werden ausser die main Datei alle anderen (hier die calculator.cpp und calculator.hpp) automatisch generiert und die main.Funktion der main- Datei ist auch vorgegeben. Zudem ist der Linux Befehl :
    g++ c.cpp -I$AXISCPP_HOME/include -I$AXISCPP_HOME/lib -ldl -L<PathToTheLibrary>laxis_client.so -o calculator´
    auch vorgegeben. Mittlerweile hab ich erfahren dass die version (beachte die aktuellste der Seite) sehr bugbehaftet ist und keineswegs verwendet werden soll. Also mittlerweile glaub ich das es ein Bug in der Axis Engine zu sein scheint. So benutze ich jetzt Axis2C, mal gucken ob es da besser läuft...

  • Also ich dachte das in der main Datei keine Defintion von Calculator sein muss, deshalb binde ich ja auch die Header-Datei Calculator.hpp ein.


    Die Header-Datei enthaelt die Definition der Klasse Calculator, d.h. die Liste aller Members der Klasse. Das ist gut so, und damit kann man Code schreiben, der auf diese Members zugreift. Wenn man allerdings ein vollstaendiges Programm linken will, muessen die Definitionen der Methoden (d.h. der Koerper der Methode, nicht nur die Deklaration) dem Linker auch bekannt sein. Die stehen hier aber weder in der main-Datei noch in der Header-Datei (und das ist auch gut so!).

    Zitat

    so in dieser main Datei hab ich auch keine Definition der Klasse aber es lässt sich einwandfrei compilieren und linken..


    Nein:

    Code
    > g++ main.C  
    /tmp/ccMlii7h.o: In function `main':
    main.C:(.text+0x81): undefined reference to `VersionPortType::VersionPortType()'
    main.C:(.text+0x8f): undefined reference to `VersionPortType::~VersionPortType()'
    collect2: ld returned 1 exit status


    main.C kompiliert, linkt aber ohne das andere File nicht. Ob du das andere File als Source (.C oder .cpp oder wie dus gerne nennst) oder als Objektfile (.o) angibst, ist wurscht, du musst aber. Ich glaube dir nicht, dass du es anders schaffst. Wenn doch, wuerde mich sehr der Befehl interessieren, mit dem du es machst.

    Im Uebrigen nervt es gewaltig, dass du bestimmte Sachen fett machst und offenbar auch mit der Groesse der Schriftart spielst. Bitte verzichte darauf. Fuer Code und Befehlszeilen ist die Code-Umgebung gut, alles andere braucht ueblicherweise nicht hervorgehoben werden.

    *plantsch*

  • Also ich hab die Dateien mit der KDevelop-IDE (Open SUSE Linux) kompiliert und gelinkt bekommen.. Komisch denn es wird auch der g++ Compiler benutzt..
    Ich weiss nicht ob ich das jetzt verwechsle, aber die .hpp Dateien enthalten die Deklarationen der der Memberfunktionen der Klassen und nicht die Definitionen. Diese werden in der .cpp-Datei geschrieben. Nach dem Motto: Was gibt es für Methoden dann guck in die hpp-Datei und was machen die Methoden dann guck in die cpp-Datei....

    Mit der Grösse der Schriftart spiele ich allerdings nicht, mach nur ab und zu was fett wie z.b. bestimmte Befehle oder so ....da wo ein kleiner Tippfehler schon grosse Auswirkungen hat...

    Gruss

  • Also ich hab die Dateien mit der KDevelop-IDE (Open SUSE Linux) kompiliert und gelinkt bekommen.. Komisch denn es wird auch der g++ Compiler benutzt..


    Ja, aber offenbar hast du ein "Projekt" oder sowas angelegt, wo beide C++-Files drin sind, und KDevelop ist intelligent genug, sie nacheinander zu kompilieren und dann zusammenzulinken, wie es sich gehoert. Wenn du das bei deinem Axis-Projekt nachvollziehen willst, musst du es auch so machen, egal was fuer ein fehlerhafter Befehl von einer fehlerhaften Doku vorgegeben wird. Weiter oben steht, wie das geht. Die -I-Flags wirst du ueberall dort brauchen, wo ein .cpp-File in ein .o kompiliert wird, -L und -l dort, wo .o-Files zu einem Gesamtprogramm zusammengelinkt werden.

    Wenn du mehr Hilfe brauchst, dann sags. Aber versuch nicht Leuten einzureden, was wie kompiliert und linkt, wenn du keine Ahnung hast, was deine IDE hinter deinem Ruecken macht.

    Zitat

    Ich weiss nicht ob ich das jetzt verwechsle, aber die .hpp Dateien enthalten die Deklarationen der der Memberfunktionen der Klassen und nicht die Definitionen. Diese werden in der .cpp-Datei geschrieben. Nach dem Motto: Was gibt es für Methoden dann guck in die hpp-Datei und was machen die Methoden dann guck in die cpp-Datei....

    Genau. Und der Linker muss eben auch "in die cpp-Datei gucken", um das vollstaendige Programm erstellen zu koennen.

    Zitat

    Mit der Grösse der Schriftart spiele ich allerdings nicht

    Also wenn du deine Code-Beispiele mit meinen vergleichst, solltest du einen Groessenunterschied sehen. Der kommt nicht von mir. Aber zu deiner Verteidigung, du hast moeglicherweise so einen komischen Editor-Modus mit Formatierung aktiviert.

    *plantsch*

  • also erstmal danke für die antworten an euch.
    Pantschkuh: Ich versuche hier niemanden irgendwas einzureden, wie was compiliert und gelinkt wird. Ich habe nur gesagt, dass es unter meiner IDE läuft. Ich hab auch nicht erzählt, dass ich davon Ahnung habe. Du kommst mir leicht aggressiv vor, vielleicht solltest du mal wieder bisl sport machen, um vom PC wegzukommen...
    RingDing: Deine Kommentare sind sehr konstruktiv

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!