2016-05-13 24 views
1

Bei Verwendung der Verknüpfungsoption "lazy linking" "-lazy-lz", auf die in this question verwiesen wird, verzögert das Laden einer abhängigen dynamischen Bibliothek den Linker, der Teil von Xcode 7.2.1 ist (Apple LLVM Version 7.0.2 (clang-700.1 0,81)), erzeugt diesen Fehler:Warum verursacht die Option "Lazy Linking" den Fehler "Illegale Datenreferenz"?

ld: illegal data reference to __ZN9WBRefSpecD1Ev in lazy loaded dylib 

... wo die verstümmelten C++ Symbol der Klasse destructor dylib in meinem Single-Klasse verweist: _WBRefSpec :: ~ WBRefSpec()

ich kann‘ t eine direkte Referenz irgendwo finden, um anzuzeigen, was dieser Fehler möglicherweise bedeuten könnte - oder was könnte es verursachen.

EXPORT WBRefSpec::~WBRefSpec(void) 
{ 
    ClearEntireRefSpec(); // commenting out this call doesn't affect error message! 
} 

... wo EXPORT das üblich ist:

In der CPP-Datei wird der destructor definiert

#define EXPORT __attribute__((visibility("default"))) 

... und natürlich in der Header-Datei definiert als öffentliches Mitglied der Klasse:

~ WBRefSpec (void);

Wer hat das schon einmal gesehen oder hat eine Ahnung, was diesen Fehler verursacht?

EDIT/ANTWORT:

Die Antwort auf die illegale Datenreferenz war, dass es eine CPP-Datei mit einer Elementfunktion der Klasse definiert wurde, die deklariert „static WBRefSpec foo;“ Entfernt das und Bingo, kein Verbindungsfehler.

(entfernt Link Details, da sie nicht relevant für die Frage waren)

+0

Post, wie Sie Ihr komplettes Programm erstellen/verknüpfen, bitte – xaxxon

+0

Die Dylib muss wahrscheinlich einen nicht-faulen Zeiger mit dem anderen binden, um zu arbeiten. –

+0

@xaxxon - Link-Einstellungen veröffentlicht (einige Pfade "bereinigt"). Soll ich es zur besseren Lesbarkeit formatieren? – SMGreenfield

Antwort

0

Die Antwort auf die illegale Datenreferenz war, dass es eine CPP-Datei mit einer Elementfunktion der Klasse definiert wurde, die „statische WBRefSpec foo erklärt; "

WBRefSpec& XMLErrorLogFile::GetLogFileInAppFolder() 
{ 
    static WBRefSpec logFileInAppFolder; 
    return logFileInAppFolder; 
} 

Als Test habe ich entfernt statisch, und Bingo, keinen Verbindungsfehler.

Aber HINWEIS: nur "statische" in diesem Fall bearbeiten würde eine sehr schlechte Idee und erstellen Sie ein anderes sehr ernstes Problem: einen Verweis auf ein Objekt auf dem Stapel zugeordnet zurück!

Ich denke, wenn ich eine Klasse Datenelement, dass eine statische WBRefSpec * ist, und nur in meiner Funktion initialisieren (aber nur einmal), dann wird das Problem auch weg.

Die Ironie ist, dass ich dieses Muster basierend auf einer ausgezeichneten SO-Antwort auf jemandes anderen unrelated posting wählen.