Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » SharedObjects - 'multiple definition of ...'

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.01.2008, 12:35 Uhr
FunnyDingo



Während ich gerade beim rauchen noch mal über das Problem nachgedacht habe viel mir ein: Warum hat er überhaupt das undefined Symbol gemeldet? _NetworkController->getLoadedNPMs() rufe ich über das SharedObject gar nicht auf. Kann ja nur sein, weil es bestandteil der tServer Klasse ist, oder?
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.01.2008, 14:48 Uhr
FunnyDingo



Ich glaube ich habs. Ein -Wl,--export-dynamic scheint wunder zu wirken. Nun erstmal extrem Testing.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: