OSX 10.5 Leopard Symbol Mangeln mit $non_lazy_ptr
Warum hat Leopard mangle einige Symbole mit $non_lazy_ptr? Noch wichtiger ist, was ist die beste Methode, um fix undefined symbol Fehler, da ein symbol wurde entstellt mit $non_lazy_ptr?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus: Developer Connection - Indirekte Adressierung
Indirekten Adressierung ist der name der code-Generierung Technik, mit der Symbole definiert, die in eine Datei verwiesen werden, die aus einer anderen Datei, ohne dass die referenzierende Datei, um die explizite Kenntnis der layout-Datei definiert das symbol. Also, die Definition der Datei kann geändert werden, unabhängig von der referenzierenden Datei. Indirekte Adressierung minimiert die Anzahl der Standorte, der geändert werden muss, durch den dynamischen linker, die eine code-sharing und verbessert die Leistung.
Wenn eine Datei verwendet die Daten, die in einer anderen Datei definiert ist, schafft es das symbol Referenzen. Ein symbol Referenz identifiziert die Datei, aus der ein symbol importiert wird und die referenzierte symbol. Es gibt zwei Arten von symbol-Referenzen: nonlazy und faul.
Nonlazy symbol-Referenzen werden aufgelöst (gebunden an deren Definitionen), indem der dynamische linker, wenn ein Modul geladen wird.
Ein nonlazy symbol Referenz ist im wesentlichen ein symbol-Zeiger—ein Zeiger-große Stück von Daten. Der compiler erzeugt nonlazy symbol verweist für die Daten-Symbole oder die Funktion Adressen.
Faul, symbol-Referenzen werden aufgelöst, indem der dynamische linker das erste mal, dass Sie verwendet werden (nicht beim laden). Nachfolgende Aufrufe der referenzierten symbol springen Sie direkt in den symbol-definition.
Faul-symbol verweist auf eine Zeiger-symbol und ein symbol stub, eine kleine Menge von code, der direkt dereferenziert und springt durch das symbol-Zeiger. Der compiler erzeugt faul symbol verweist, wenn es auf einen Aufruf einer Funktion in einer anderen Datei definiert.
In der Mensch-sprich: der compiler generiert stubs mit $non_lazy_ptr angehängt, um Sie zu beschleunigen, zu verknüpfen. Du bist wahrscheinlich zu sehen, dass die Funktion Foo aus verwiesen _Foo$non_lazy_ptr nicht definiert ist, oder so etwas wie, dass - diese nicht die gleiche Sache. Stellen Sie sicher, dass das symbol tatsächlich deklariert und exportiert in die Objekt-Dateien/Bibliotheken, die Sie verknüpfen, Ihre app zu. Das war zumindest mein problem, ich dachte auch, es ist ein komisches linker Ding, bis ich herausfand, dass mein problem war, an anderer Stelle - es gibt mehrere andere mögliche Ursachen gefunden auf Google.
ist eine solide Lösung für das Problem. Ich hatte das gleiche problem beim erstellen der PJSIP Bibliothek für iOS. Diese Bibliothek Sortieren-von nutzt eine autoconf-basierte system, aber braucht ein wenig Feintuning, um verschiedene Dateien zu machen, alles in Ordnung für iOS. In der Prozess zu tun, dass ich es geschafft die zu entfernen ranlib Zeile in der Regel für Bibliotheken und dann begann sich ein Fehler in den link von meinem Projekt über
_PJ_NO_MEMORY_EXCEPTION
aus verwiesen_PJ_NO_MEMORY_EXCEPTION$non_lazy_ptr
wird nicht definiert.Hinzufügen des ranlib-Linie zurück, um die library-Datei gelöst. Nun meine vollständigen Eintrag für die LIBS in den Regeln.mak ist
Hoffe, das hilft anderen auch, versucht die Allgemeine UNIX-konfigurierten externen Bibliotheken mit dem iPhone oder iOS.
Wenn jemand stolpert das gleiche problem hatte ich auch:
Hatte
extern NSString* const someString;
in der header-Datei, aber vergessen hat, es der Umsetzung-Datei. alsNSString* const someString=@"someString";
Diese gelöst.
ranlib -c auf Ihrer library-Datei behebt das problem