Wie erstellen Sie statische Bibliothek für iOS ohne alle Symbole, öffentlichkeit
Diese Frage wurde vorher gefragt, aber das Graben in der Dokumentation für die verschiedenen Entwicklungs-tools, die es scheint, wie diese ist möglich, nur eben nicht offensichtlich.
Motivation:
Machen Sie eine statische Bibliothek für die Nutzung durch andere iOS-Entwickler. Einige Symbole in der Bibliothek zu Problemen führen, wenn exportiert, so möchte ich, dass Sie ausschließlich interne Symbole. Mit der dynamischen Bibliothek dies ist einfach, benutzen Sie einfach -exported_symbols_list
libtool
(ld
) argument und die Liste der diejenigen, die Sie wollen öffentlichkeit. libtool
Dokumentation wird nicht zulassen, dass dieses argument für statische Bibliotheken.
Bibliothek hat mehrere ObjectiveC .m-Dateien, die code von anderen. Nur eine Klasse in der Gruppe muss öffentlich gemacht werden um die Benutzer des Finales .eine statische Bibliothek.
Versucht libtool -exported_symbols_list publicsymbols.exp
aber das argument libtool
wird nicht unterstützt mit -static
für statische Bibliotheken.
Nicht machen das private Symbole mit Attributen (wenn, dass würde auch funktionieren), weil Sie erforderlich sind, von den anderen .m Dateien in der Gruppe.
sieht aus wie ld
können mehrere .o-Dateien und verlinken Sie Sie in eine neue .o-Datei (über den -r
argument) und das es nicht die "dynamische nur" Haftungsausschluss für den -exported_symbols_list
argument (das könnte nur unklar, Dokumentation...).
nur als test Baue ich mein Projekt mit Xcode, so habe ich alle .o-Dateien aus, und dann versuchen, zu nennen ld
auf den Befehl Linie, etwa so:
ld -r -x -all_load -static -arch armv6 -syslibroot {path}
-filelist /Users/Dad/ABCsdk/iphone-ABClib/build/ABCLib.build/Distribution-iphoneos/ABCLib-device.build/Objects-normal/armv6/ABCsdk.LinkFileList
-exported_symbols_list {exp file path} -o outputfile.o
wo die {path} geben Sie Dinge, die haben lange Wege zu den entsprechenden stellen in es.
aber ich bekomme Fehler wie den folgenden:
/usr/bin/ld_classic: /Users/Dad/ABCsdk/iphone-ABClib/build/ABCLib.build/Distribution-iphoneos/ABCLib-device.build/Objects-normal/armv6/ABCmain.o inkompatible Datei enthält nicht unterstützte Art von Abschnitt 3 (_TEXT,_picsymbolstub4) im load-Befehl 0 (angeben müssen, "- dynamisch" verwendet werden)
also irgendwas scheint da schief...
Jeder weiß, ein cleverer Weg, um diese Arbeit zu machen? Danke.
- Welche Art von Symbolen müssen Sie sich verstecken?
- Symbole, die in Konflikt geraten kann, wenn Sie die gleiche sub-Bibliothek bereits verbunden, die in Ihrer Anwendung (JSONkit sagen). Ich kann, natürlich, nur sind die JSONKit Dateien und sagen Sie auch, wenn Sie nicht bereits in Ihrem Projekt, aber ich hatte gehofft, für ein Einzelzimmer .h-Datei und .eine Datei, die Hinzugefügt werden, um das Projekt für eine saubere integration.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist wirklich nicht möglich, tut mir Leid zu sagen. Es hat zu tun mit der Art und Weise statische Bibliotheken arbeiten. Eine statische Bibliothek ist wenig mehr als ein Haufen von Objekt
*.o
Dateien gebündelt, sondern eine dynamische Bibliothek ist ein ladbares binäres Bild, genau wie eine ausführbare.Angenommen, Sie haben vier Dateien,
common
, die "privaten"fn1
fordertcommon
.fn2
fordertcommon
.other
.In einer dynamischen Bibliothek, der linker bündelt alles in einem großen Teil des Codes. Die Bibliothek exportiert
other
,fn1
, undfn2
. Sie haben, um das laden der gesamten Bibliothek oder gar nichts, aber zwei Programme können sowohl laden, ohne mehrere Kopien im Speicher. Der Einstieg incommon
ist einfach nicht vorhanden, aus der symbol-Tabelle), können Sie es nicht nennen, die von außerhalb der Bibliothek, da der linker kann Sie nicht finden.Beachten Sie, dass eine Anwendung und eine shared-library, im wesentlichen das gleiche format: eine Anwendung ist im Grunde eine geteilte Bibliothek, die exportiert nur ein symbol,
main
. (Dies ist nicht ganz richtig, aber fast.)In eine statische Bibliothek, der linker läuft nicht. Alle Dateien erhalten Sie zusammengestellt *.o Dateien und setzen Sie in eine *.eine Bibliothek mit Archiv. Interne Verweise werden nicht aufgelöst werden.
Angenommen, Ihre Anwendung fordert
fn1
. Der linker sieht eine ungelöste Aufruffn1
, und dann sieht durch die Bibliotheken. Es findet eine definition fürfn1
fn1.o. Dann der linker merkt eine ungelöste Aufrufcommon
, so sucht er es in common.o. Dieses Programm wird nicht den code vom fn2.c oder andere.c, weil Sie nicht verwenden die Definitionen aus diesen Dateien.Statische Bibliotheken sind sehr alt, und Sie haben nicht die features von dynamischen Bibliotheken. Man kann sich eine statische Bibliothek, als im Grunde eine zip-Datei voller kompilierten Quellcode, im Gegensatz zu einer dynamischen Bibliothek, die miteinander verknüpft sind. Niemand jemals die Mühe gemacht, erweitern Sie das Archiv-format hinzufügen-symbol Sichtbarkeit. Wenn Sie eine Verknüpfung mit einer statischen Bibliothek verwendet wird, erhalten Sie das gleiche Ergebnis, als wenn Sie hatte Hinzugefügt, für die Bibliothek source code zu Ihrem Programm.
Die kurze version: dynamischen Bibliothek hat eine Symboltabelle werden alle exportierten Symbole, aber keiner der privaten Symbole. In der gleichen Weise, eine Objekt-Datei hat eine Liste seiner
extern
Symbole, aber keine derstatic
lieben. Aber eine statische Bibliothek hat keine Symboltabelle es ist nur ein Archiv. Es gibt also keinen Mechanismus, um code private zu einer statischen Bibliothek (anderen als Objekte definierenstatic
, aber das funktioniert nicht für Objective-C-Klassen).Wenn wir wüssten, warum Sie versucht haben, dies zu tun, vielleicht könnten wir Ihnen einen Vorschlag. (Ist es für die Sicherheit? Name-clashes? All diese Fragen Lösungen haben.)
XCode BuildSetting können dies tun!
1. Set
Perform Single-Object Prelink
zuYES
2. Set
Exported Symbols File
zupath_for_symbols_file
vielleicht sollten Sie entfernen
-static
,-exported_symbols_list
kann nicht arbeiten, statische lib, aber wirksam auf Objekt-Datei.