Warum bin ich immer ein symbol lookup error?
Ich Schreibe eine Bibliothek, die dynamisch geladen in meine main-Applikation mit dlsym.
Ich habe die folgenden Dateien:
Bibliothek.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();
}
}
business/BCGateway.h
#include <igateway.h>
class BCGateway: public IGateway {
public:
static IGateway* instance();
protected:
BCGateway();
private:
static IGateway* instance_;
};
business/BCGateway.cpp
#include "BCGateway.h"
IGateway* BCGateway::instance_ = NULL;
IGateway* BCGateway::instance(){
return instance_ ? instance_ : (instance_ = new BCGateway);
}
Ich kann eine Verbindung zu der Bibliothek und erfolgreich laden Sie die Library-Instanz. Aber wenn ich Anrufe, Bibliothek->getGateway() in meine main-app bekomme ich die folgende Fehlermeldung:
symbol lookup error: ./gateways/libSwisscomXtraZone.so: undefined symbol: _ZN9BCGateway8instanceEv
Bitte können Sie mir einen Tipp geben, wie kann ich dies beheben? Ich bin stecken.
Dank.
InformationsquelleAutor Sämy | 2009-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Legte ich den Fehler durch
c++filt
sagt er, dass der verstümmelte name steht fürDies deutet darauf hin, dass Sie anrufen
BCGateway::instance()
irgendwo und vergessen, zu verlinken, die gegenBCGateway.o
oder Sie gar vergessen zu definierenBCGateway::instance()
.InformationsquelleAutor Johannes Schaub - litb
sowie alle statischen Elemente müssen intialised in einer cpp-Datei. Zu sehen, wie BCGateway::Instanz ist nicht intialised an jedem Punkt, es wird nicht möglich sein, finden Sie das symbol. Das problem ist jedoch, dass, wenn Sie eine BCGateway.cpp und initialisieren die Instanz dann werden Sie am Ende nur eine Instanz über, potenziell, viele Prozesse. Dies kann oder kann nicht ein problem sein, je nachdem, wie Sie die DLL verwenden.
Alle Symbole müssen sein 'definiert'. Dieser ist nur 'erklärt'. Ich denke, das ist, was du meinst zu sagen. (Als Gegensatz zu 'initialisiert')
Cheers xtofl. Du hast ganz Recht 🙂
gut, ich wusste nur nicht, fügen Sie den Inhalt der BCGateway.cpp oben. Ich habe es in meiner Bibliothek. Ich bearbeitete meinen ersten post eingefügt und die fehlenden BCGateway.cpp
InformationsquelleAutor Goz