Was ist der Unterschied zwischen eingebetteten Binärdateien und verknüpften Frameworks?

84

Bei Verwendung eines externen Frameworks verfügt Xcode jetzt über einen Abschnitt mit eingebetteten Binärdateien sowie über verknüpfte Frameworks .

Geben Sie hier die Bildbeschreibung ein

Wenn Sie ein externes Framework herunterladen und Finder-> in Xcode ziehen, wird das Framework in den verknüpften Frameworks und Bibliotheken platziert Abschnitt .

Wenn Sie eine Bibliothek mit Karthago erstellen, wird empfohlen, diese in die eingebetteten Binärdateien zu ziehen Abschnitt .

Beide scheinen in Bezug auf die Verknüpfung zu funktionieren, da die API in beiden Fällen verfügbar wird. Wenn Sie ein Framework zum Abschnitt " Eingebettete Binärdateien" hinzufügen, wird es auch automatisch zu den verknüpften Frameworks und Bibliotheken hinzugefügt Abschnitt " .

Also, wer hat recht? Karthago oder der Rest des Internets? und warum gibt es zwei Möglichkeiten, externe Ressourcen in Xcode-Projekte einzubeziehen?

Maxim Veksler
quelle
Und funktioniert es, wenn Sie auf dem Gerät testen?
Trojanfoe
@trojanfoe ja das tut es.
Maxim Veksler
Dies ist nicht sinnvoll, es sei denn, es handelt sich entweder um 1) im Abschnitt für eingebettete Binärdateien oder um 2) einen Build-Schritt zum Kopieren des Frameworks in das App-Bundle während des Builds.
Trojanfoe
2
Karthago empfiehlt, nur für OSX-Anwendungen in "Embedded Binaries" zu ziehen. Für iOS empfehlen sie nur "Verknüpfte Frameworks und Bibliotheken".
Damnum
Mögliches Duplikat von Link Binary mit Bibliotheken VS Embed Frameworks
Suhaib

Antworten:

70
  1. Verknüpfen - Wir müssen ein Framework verknüpfen, wenn wir eine darin definierte API verwenden.

  2. Einbetten - Dieser Prozess stellt sicher, dass das hinzugefügte Framework in das App-Bundle eingebettet wird, und hilft möglicherweise dabei, Code zwischen der App und allen Erweiterungs-Bundles auszutauschen. Wir binden nur Frameworks von Drittanbietern ein und nicht die von iOS bereitgestellten, da diese auf dem Gerät verfügbar sind. Wenn wir einbetten, bedeutet dies, dass wir auch eine Verknüpfung zu ihnen herstellen müssen, damit Xcode den Build kompilieren und erstellen kann. Wenn die App auf dem Gerät ausgeführt wird, wird das eingebettete Framework bei Bedarf in den Speicher geladen.

Shripada
quelle
1
Was meinst du mit dem Teil "wenn nötig"? Bedeutet das, dass das eingebettete Framework geladen wird, wenn es zur Laufzeit benötigt wird? Wann wird die Verknüpfung Ihrer Meinung nach für ein dynamisches Framework erfolgen?
Bartosss
Gibt es einen Fall, den wir brauchen embedund nicht link? Und umgekehrt? Und warum?
Allenlinli
Ich denke, Sie müssen nur Frameworks verknüpfen, deren API Sie direkt im Code verwenden. Transitive Abhängigkeiten, auf die im Anwendungscode nicht verwiesen wird, sollten nur eingebettet werden, wenn ich korrekt bin.
Werner Altewischer
15

Wenn Sie die Binärdatei einbetten, wird sie in Ihr Produkt aufgenommen. Wenn Sie eine Bibliothek oder ein Framework nur verknüpfen, ohne es einzubetten, ist es nicht Teil Ihres Produkts.

In iOS8 müssen jedoch alle Frameworks von Drittanbietern "eingebettet" sein. Sogar ein Framework, das von verschiedenen Programmen gemeinsam genutzt wird, muss in jedes einzelne dieser Programme "eingebettet" werden. In dem Fall, in dem es auf dem Gerät an einem freigegebenen Speicherort installiert wurde, kann jeder andere Installationsprozess, der denselben "eingebetteten" Code vom freigegebenen Speicherort verwendet, diese vorhandene Installation wiederverwenden. Dies ist spezifisch für iOS8. Vor iOS8 war dies nicht möglich. Außerhalb der iOS-Welt wäre diese Antwort nicht korrekt.

Basti
quelle
2
"Das Einbetten der Binärdatei erleichtert dem Benutzer die Installation Ihres Produkts, falls er noch keine funktionierende Installation auf seinen Computern hat" klingt nach OSX, nicht nach iOS ... wenn er nicht über die Bibliothek verfügt installiert (dh es ist nicht Standard), wird die App einfach nicht geladen.
Trojanfoe
es würde nicht nur nicht geladen, @trojanfoe, es würde abgelehnt und Sie könnten es überhaupt nicht installieren (es sei denn, Sie sind der Entwickler oder verwenden ein Enterprise-Konto ...)
doggod
Dynamisch verknüpfte Frameworks sind seit iOS 8
Basti
Wenn der Benutzer Ihre App installiert und diese App ein dynamisch verknüpftes Framework enthält, kann automatisch nach diesem Framework gesucht werden. Dies ist jedoch ein zusätzlicher Punkt, der während des Installationsprozesses des Benutzers fehlschlagen kann und einen Linkbearbeitungsfehler auslöst, der die Anwendung beendet. Ich sehe also keinen Grund, warum die Antwort nur für OS X und nicht für iOS gelten sollte. Bitte seien Sie genauer, wenn Sie Verbesserungspotential in Bezug auf meine Antwort sehen. Oder stimmen Sie dieser Antwort zu, um einen Mitentwickler zu einem vollwertigen SO-Mitglied zu machen, wenn Sie der Meinung sind, dass die Antwort bereits korrekt ist;)
Basti
Es ist der optionale Aspekt Ihrer Antwort, gegen den ich Einwände habe. Wenn das Framework von Drittanbietern stammt, muss es Teil des App-Bundles sein. Zeitraum. Dies gilt auch weitgehend für OSX-Apps (sicherlich für Apps, die über den Mac App Store vertrieben werden).
Trojanfoe
0

LinkingMehr dazu Linkerfunktioniert zur Kompilierungszeit oder zum Laden / Ausführen. Linker Kopieren Sie a Libraryin eine Zielbinärdatei. Da Frameworkes autonom ist, ist der Linkerin diesem Fall dafür verantwortlich, Dynamic Frameworkden Pfad innerhalb des Systemladeprogramms zu finden und zu verknüpfen oder innerhalb eines Bundles zu suchen und zu verknüpfen .

Embeddingist ein Prozess zum Kopieren der Binärdatei in die Zielbinärdatei. Infolgedessen befindet es sich im Inneren.

Lesen Sie hier mehr

yoAlex5
quelle
-2

Meines Erachtens enthält die eingebettete Binärdatei nur ein dynamisches Framework, das unter iOS 8 und höher verfügbar ist. Andernfalls können Sie nur das statische Framework verknüpfen.

Lei Zhang
quelle