2009-07-13 12 views
6

Sto scrivendo una libreria, che viene caricata dinamicamente nella mia applicazione principale con dlsym. Ho i seguenti file:Perché viene visualizzato un errore di ricerca dei simboli?

library.h

#include <ilibrary.h> 
#include <igateway.h> 

class LibraryImpl; 

class Library: public ILibrary { 
public: 
    static ILibrary* instance(); 

    IGateway* getGateway() const; 

protected: 
    Library(); 
    virtual ~Library(); 

private: 
    static ILibrary* instance_; 
    LibraryImpl* library_; 
}; 

extern "C" { 
    IMPORT_EXPORT ILibrary* getLibrary(); 
} 

library.cpp

#include "library.h" 

#include "business/BCGateway.h" 


class LibraryImpl { 
public: 
    IGateway* getGateway(); 
}; 

IGateway* LibraryImpl::getGateway() { 
    return BCGateway::instance(); 
} 



ILibrary* Library::instance_ = NULL; 
ILibrary* Library::instance() { 
    return instance_ ? instance_ : (instance_ = new Library); 
} 

Library::Library() { 
    library_ = new LibraryImpl(); 
} 

Library::~Library() { 
    delete library_; 
} 

IGateway* Library::getGateway() const { 
    return library_->getGateway(); 
} 


extern "C" { 
    IMPORT_EXPORT 
    ILibrary* getLibrary(){ 
     return Library::instance(); 
    } 
} 

affari/BCGateway.h

#include <igateway.h> 

class BCGateway: public IGateway { 
public: 
    static IGateway* instance(); 

protected: 
    BCGateway(); 

private: 
    static IGateway* instance_; 
}; 

affari/BCGateway.cpp

#include "BCGateway.h" 

IGateway* BCGateway::instance_ = NULL; 
IGateway* BCGateway::instance(){ 
    return instance_ ? instance_ : (instance_ = new BCGateway); 
} 

Posso connettermi alla libreria e caricare correttamente l'istanza Library. Ma quando chiamo Library-> getGateway() nel mio principale-app ottengo il seguente errore:

symbol lookup error: ./gateways/libSwisscomXtraZone.so: undefined symbol: _ZN9BCGateway8instanceEv

potete per favore darmi un suggerimento, come posso risolvere questo? Sono bloccato.

Grazie.

risposta

7

ho messo l'errore attraverso c++filt, si dice che il nome storpiato è sinonimo di

BCGateway::instance() 

Questo suggerisce che si chiama BCGateway::instance() da qualche parte e dimenticato di collegare contro BCGateway.o o addirittura dimenticato di definire BCGateway::instance().

+0

Scritto il mio ultimo commento, ho visto, che ho appena dimenticato di aggiungere BCGateway.h e BCGateway.cpp al mio file di progetto, da cui è stato generato il makefile. Quindi questa classe non è stata effettivamente dichiarata nella mia biblioteca. Dato che sono molto nuovo alle librerie C++, ho pensato che fosse un problema con la dichiarazione della libreria o giù di lì. Grazie mille per il vostro aiuto. –

1

bene tutti i membri statici devono essere inizializzati in un file cpp. Visto che BCGateway :: instance non è stato inizializzato in alcun punto, non sarà in grado di trovare il simbolo. Il problema è, tuttavia, che se si crea un BCGateway.cpp e si inizializza l'istanza, si finisce per avere solo un'istanza attraverso, potenzialmente, molti processi. Questo può o non può essere un problema a seconda di come si usa la DLL.

+0

Le istanze non verranno condivise tra i processi. Neanche in una libreria condivisa. –

+0

Tutti i simboli devono essere 'definiti'. Questo è solo "dichiarato". Immagino sia quello che intendi dire. (Al contrario di 'inizializzato') – xtofl

+0

Cheers xtofl. Hai perfettamente ragione :) – Goz

Problemi correlati