000
24.01.2008, 12:10 Uhr
FunnyDingo
|
Hallo zusammen,
ich verstehe das gerade gar nicht. Ich habe die ganze Zeit mit meinem SharedObjects wurderbar arbeiten können. Jetzt habe ich gerade etwas neues eingebaut:
Es gibt eine "kontrollierende" Klasse tServer (Singleton). In der main hole ich mir die Instanz und dann gehts wie folgt weiter:
C++: |
#include "chat.dispatcher.h" #include "network.controller.h"
class tDispatcher; class tNetworkController;
class tServer { private: tDispatcher *_Dispatcher; tNetworkController *_NetworkController;
tServer();
public: static tServer *getInstance() { static tServer theInstance; return &theInstance; } bool run(); void *awakeDispatcher(); ipcQueue<tYacConnection *> *getDispatcherQueue(); };
|
Die Forward Declaration muss sein, weil tDispatcher und tNetworkController jeweils im Konstruktur einen tServer* erwarten.
C++: |
#include "application.logger.h" #include "chat.dispatcher.h" #include "network.controller.h"
tServer::tServer() { _Dispatcher = new tDispatcher(this); _NetworkController = new tNetworkController(this); //dispatcher = new tDispatcher(); //networkController = new tNetworkController(&dispatcher->mQueue, dispatcher); }
bool tServer::run() { if (_NetworkController->getLoadedNPMs() <= 0) { LOG_NORMAL("main", "No NPMs found, exiting"); return false; }
//sleep(10); _Dispatcher->wait(); LOG_DEBUG("main", "Removing networkController"); delete _NetworkController; LOG_DEBUG("main", "Removing dispatcher"); delete _Dispatcher;
return true; }
void *tServer::awakeDispatcher() { _Dispatcher->awake(); }
ipcQueue<tYacConnection *> *tServer::getDispatcherQueue() { return &_Dispatcher->mQueue; }
|
Nun übergebe ich beim Aufrufen der Funktion aus dem SharedObject (das macht tNetworkController) ebenfalls den Zeiger auf tServer, damit ich aus dem SharedObject heraus, Funktionen der tServer aufrufen kann (zum Beispiel tServer::awakeDispatcher).
Ich hoffe das ist bis hierhin nachvollziehbar.
Nun wollte ich den ganzen Kram kompilieren. Beim ersten Versuch hat es auch geklappt, aber leider habe ich zur Laufzeit einen Fehler bekommen:
Error while loading npm ./npm/http.so: undefined symbol: _ZN18tNetworkController13getLoadedNPMsEv
An dem Symbolnamen ist ja nocht ziemlich gut zu erkennen, was ihm da nicht gefällt. Also habe ich beim kompilieren des SharedObjects nun noch network.controller.o, chat.server.o und chat.dispatcher.o dran gehängt. Nun gibt es einen Fehler beim kompilieren:
Code: |
core/chat.dispatcher.o: In function `new_allocator': /usr/include/c++/4.1.0/bits/stl_deque.h:83: multiple definition of `tDispatcher::cleanup()' core/chat.dispatcher.o:/usr/include/c++/4.1.0/bits/stl_deque.h:83: first defined here core/chat.dispatcher.o: In function `tDispatcher::run()': core/chat.dispatcher.cpp:29: multiple definition of `tDispatcher::run()' core/chat.dispatcher.o:core/chat.dispatcher.cpp:29: first defined here core/chat.dispatcher.o: In function `tDispatcher': core/chat.dispatcher.cpp:22: multiple definition of `tDispatcher::tDispatcher(tServer*)' core/chat.dispatcher.o:core/chat.dispatcher.cpp:22: first defined here core/chat.dispatcher.o: In function `tDispatcher': core/chat.dispatcher.cpp:22: multiple definition of `tDispatcher::tDispatcher(tServer*)' core/chat.dispatcher.o:core/chat.dispatcher.cpp:22: first defined here collect2: ld returned 1 exit status
|
Hm. Langsam komme ich ins Grübel, ob ich überhaupt alles richtig verstanden habe. Mein Ansatz war eigentlich, dass ich aus dem SharedObject heraus Funktionen im Hauptprogramm aufrufe. Ich dachte, wenn das SharedObject die Deklaration eines Objektes kennt (in diesem fall tServer und dadurch impliziet ja auch tDispatcher und tNetworkController) und einen Zeiger auf dieses Objekt übergeben bekommt, dass das Funktioniert. Da er mir da zur Laufzeit dann aber ein "undefined symbol" raus schmeißt, scheint das ja nicht der Fall zu sein.
Ich weiß, das ist alles etwas undurchschaubar. Wenn noch fragen zur Stuktur, Code, o.ä da sind, einfach fragen ;-)
Gruß, ich hoffe jemand kann helfen! Funny -- "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)
Meine Website: http://www.funnydingo.de |