gSOAP, Xcode und Linker Probleme die zweite

Ich habe noch mal ein wenig mit den verschiedenen Optionen von gSOAP herumgespielt und dabei folgendes festgestellt: die Probleme die ich beim Linken des Projektes hatte haben scheinbar nichts mit gSOAP zu tun!
Interessanterweise tritt das Problem immer dann auf, wenn man dem Projekt zuerst die von gSOAP erzeugten Dateien, und dann die gsoap Library hinzufügt!
Macht man es umgekehrt, also erst die Libarary hinzufügen und dann die Stub Files, dann compiliert und linkt das Projekt ohne Probleme.
Eine Erklärung konnte ich für dieses Verhalten bislang nicht finden.
|

gSoap, XCode und Cocoa

Da meine Versuche, funktionierende Stubs mit WSMakeStubs zu erzeugen, fehlgeschlagen sind, habe ich mich entschlossen es mit gSOAP zu versuchen.
Also hab ich gSOAP heruntergeladen, mit ./configure -prefix=/installdir - make - make install gSOAP compiliert und installiert.
Mit "wsdl2h -o NameDerHeaderDatei.h http://url_zur_wesdldatei.wsdl" und "soapcpp2 NameDerHeaderDatei.h" hab ich die Stub Files erzeugt und anschließend die erzeugten Dateien + stdsoap2.h und stdsoap2.cpp zu meinem Xcode Projekt hinzugefügt.
Leider hat direkt der erste Versuch das Projekt zum compilieren und zu linken fehlgeschlagen.
Der Linker hat die Meldung

"_namespaces", referenced from:
_namespaces$non_lazy_ptr in stdsoap2.o
symbol(s) not found"


ausgeworfen. Intensive Recherchen bei Google haben mich leider nicht weitergebracht.

Pasted Graphic 1

Was letztendlich geholfen hat, war gSOAP erneut, mit dem Flag "--disable-namespaces" zu compilieren:

/configure --prefix=/installdir --disable-namespaces
make
make install

Die anschließend neu erzeugten Stub Files hab ich erneut in mein Projekt importiert, dann noch die Library libsoap++.a eingebunden (einfach mit der Maus vom Finder in die Dateiliste im XCode ziehen).
Leider gab es immer noch Probleme beim Linken des Projektes. Die Ursache war diesmal jedoch, dass die importierten Quellcodes nicht alle compiliert wurden. Ich hab sie dann von Hand zum Target hinzugefügt (wieder per Drag&Drop in den Abschnitt "Compile Sources"):

Pasted Graphic

Jetzt endlich kann das Projekt erfolgreich compiliert und gelinkt werden. Auch die Verwendung der erzeugten Klassen aus den Stub Files funktioniert ohne Probleme.
|

Objective-C und C++ Code mischen

Ich bin immer noch dabei eine Möglichkeit zu finden, erfolgreich einen Aufruf des Webservices auszuführen. Da meine Versuche mit den von WSMakeStubs erzeugten Stubs keinen Erfolg gebracht haben, habe ich mir nun vorgenommen mit Hilfe von gSOAP C++ Stubs zu erzeugen die ich dann in meiner Cocoa Anwendung verwende.
Dazu habe ich heute erst mal geprüft inwiefern sich Objective-C und C++ - Code miteinander kombinieren lässt. Das erste Ergebnis ist erfreulich positiv!
Die C++ Klasse konnte ich direkt im Projekt anlegen. Um diese aus meiner Objective-C Klasse aus instanzieren zu können, hat es ausgereicht die Objective-C Datei mit der Endung ".mm" statt ".m" zu versehen.
In diesem Fall wird der Objective-C++ Compiler verwendet, der eine gemeinsame Verwendung von Objective-C und C++ zulässt.
In den Projekteinstellungen lässt sich bei den Build Einstellungen allerdings auch generell die verwendete Sprache einstellen:
Pasted Graphic

Ich finde die Standardeinstellungen "According to File Type" für meinen Fall passend.
Der gemischte Code kann dann z.B. so aussehen:

CPPTestClass *cpctc = new CPPTestClass(); // Instanz von C++ Klasse erzeugen
[
textfield setIntValue: cpctc->getValue()]; // Objective-C Nachricht mit Ergebnis von C++-Methodenaufruf als Parameter
delete cpctc; // C++ Objekt löschen

Mein nächster Schritt wird jetzt sein die von gSOAP erstellten Klassen in mein Projekt zu importieren und den Webservice Aufruf darüber auszuführen.
|