iOS App mit Framework auf Gerät abgestürzt, dyld: Bibliothek nicht geladen, Xcode 6 Beta

573

Dieser Absturz war ein Blockierungsproblem. Ich habe die folgenden Schritte ausgeführt, um das Problem zu reproduzieren:

  • Erstellen Sie ein Cocoa Touch Framework-Projekt
  • Fügen Sie eine schnelle Datei und eine Klasse Dog
  • Erstellen Sie ein Framework für das Gerät
  • Erstellen Sie eine Einzelansicht-Anwendung in Swift
  • Framework in App-Projekt importieren
  • Instanziieren Sie eine schnelle Klasse aus dem Framework in ViewController
  • Erstellen Sie eine App und führen Sie sie auf dem Gerät aus

Die App stürzte sofort beim Start ab. Hier ist das Konsolenprotokoll:

dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
  Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
  Reason: image not found

Ich habe versucht, auf iOS 7.1- und 8.0-Geräten zu bauen, beide haben den gleichen Absturz. Ich kann jedoch eine App erstellen und auf dem Simulator gut ausführen. Ich bin mir auch bewusst, dass ich das Framework in Link Binary With Libraries in Required to Optional ändern kann , aber das Problem wurde nicht vollständig behoben. Die App stürzte ab, als ich eine Instanz von Dog erstellte . Das Verhalten auf dem Gerät und dem Simulator ist unterschiedlich. Ich vermute, dass wir mit einer Beta-Version von Xcode kein Framework für das Gerät verteilen können. Kann jemand Licht ins Dunkel bringen?

vladof81
quelle
1
Was ich nicht verstehe, ist, warum alle anderen Frameworks von Drittanbietern sofort funktionieren und einfach per Drag & Drop Link Binary with Librariesin Ihr App-Bundle kopiert werden können, während dies bei benutzerdefinierten Frameworks einfach nicht der Fall ist.
Fatuhoku
Die Antwort von sazzad hissain khan hier stackoverflow.com/questions/26024100/… ist die beste Antwort ..
Ankit Kumar
1
Schauen Sie sich diese stackoverflow.com/a/52129141/2020034 an . Es funktioniert
Vinayak Parmar
Sie können eine fette Bibliothek erstellen
mohsen
Xcode-Version stimmt nicht überein , gelöst mit stackoverflow.com/a/55738882/5443510 .
Jimmy Yin

Antworten:

975

Auf der Registerkarte Allgemein des Ziels befindet sich ein Feld Eingebettete Binärdateien . Wenn Sie dort das Framework hinzufügen, wird der Absturz behoben.

Die Referenz finden Sie hier in den Apple Developer Forums.

vladof81
quelle
73
Ich habe das Framework in den eingebetteten Binärdateien und die Kopierphase ist ebenfalls auf "Frameworks" eingestellt. Es stürzt sowieso ab.
Loretoparisi
11
Dies wurde nur im Debugging-Modus gelöst. Ein Fehler tritt erneut auf, wenn Sie ein Projekt archivieren oder erstellen
Saad Ur Rehman
13
Das Hinzufügen von @ executeable_path / Frameworks zum 'Runpath Search Path' löste dieses Problem, dh zusätzlich zum Hinzufügen des Frameworks zu 'Embedded Binaries'
ArdenDev
14
Kann jemand helfen, wie man Frameworks in eingebetteten Binärdateien aus PODs hinzufügt?
Bonnke
3
Das Gleiche gilt. Ich möchte auch wissen , wie von PODs hinzuzufügen, da es keine „Allgemein> Embedded Binaries“ in XCode gefunden werden 6,4 PODS mit
ded
259

Für iOS größer oder gleich 8

Fügen Sie auf der Registerkarte Allgemein des Ziels im Abschnitt Eingebettete Binärdateien das Framework hinzu. Dadurch wird das Framework in das kompilierte Framework kopiert, sodass es zur Laufzeit verknüpft werden kann.

Geben Sie hier die Bildbeschreibung ein

Warum passiert dies? : weil das Framework, mit dem Sie verknüpfen, als dynamisch verknüpftes Framework kompiliert und somit zur Laufzeit verknüpft wird.

** Hinweis: ** Das Einbetten von benutzerdefinierten Frameworks wird nur in iOS> 8 unterstützt. Daher folgt eine alternative Lösung, die auf älteren Versionen von iOS funktioniert.

Für iOS weniger als 8

Wenn Sie dieses Framework beeinflussen (Zugriff auf den Quellcode / Build-Prozess haben), können Sie dieses Framework so ändern, dass es statisch und nicht dynamisch verknüpft ist. Dadurch wird der Code in Ihre kompilierte App aufgenommen und nicht zur Laufzeit verknüpft, sodass das Framework nicht eingebettet werden muss.

** Wie: ** Ändern Sie auf der Registerkarte Build-Einstellungen des Frameworks im Abschnitt Verknüpfung den Mach-O-Typ in Statische Bibliothek. Sie sollten das Framework jetzt nicht mehr in eingebettete Binärdateien aufnehmen müssen.

Statisches Framework

Einbeziehen von Assets: Um Dinge wie Bilder, Audio oder XIB / NIB-Dateien einzuschließen, empfehle ich, ein Bundle (im Wesentlichen ein Verzeichnis, weitere Informationen hier bit.ly/ios_bundle) zu erstellen und die Assets dann mit NSBundle aus dem Bundle zu laden.

Dawson
quelle
1
Wie kann ich eingebetteten Binärdateien Framework hinzufügen, wenn sich Framework in Pods befindet?
TomazStoiljkovic
Was meinst du mit "Framework ist in Pods"? Dass Ihr benutzerdefiniertes Framework über CocoaPods verteilt wird?
Dawson
2
Dies sollte "größer als oder gleich 8" sein. Ich musste dies auch auf iOS 8 tun.
Cruinh
FehlerSwift is not supported for static libraries
Jose920405
@ TomazStoiljkovic hast du das herausgefunden? Ich habe das gleiche Problem, ich habe ein Framework, das ich als Binärdatei erstellen möchte, aber es hängt von anderen Frameworks über Kakaofrüchte ab.
MegaManX
125

Nur das Framework in Ihr Projekt zu ziehen, wird nicht gut genug sein. Das ist so, als ob Sie im selben Stadion wären, aber Ihre Kinder nicht finden könnten. Folge diesen Schritten:

1) Erstellen Sie Ihr Framework

  • Entwickeln Sie Ihr Framework.
  • Sobald Ihre Entwicklung abgeschlossen ist, COMMAND+ Berstellen Sie Ihr Framework und stellen Sie sicher, dass Sie "Build Succeeded" erhalten.

Geben Sie hier die Bildbeschreibung ein

2) Greifen Sie auf Ihr Framework zu

  • Sobald Ihr Framework-Projekt erfolgreich erstellt wurde, können Sie in Ihrem ProductsOrdner in Ihrem Projekt darauf zugreifen .

Geben Sie hier die Bildbeschreibung ein

  • Klicken Sie mit der rechten Maustaste auf .frameworkund wählen Sie "Im Finder anzeigen".

Geben Sie hier die Bildbeschreibung ein

3) Platzieren Sie das Framework in Ihrem Projekt

  • Ziehen Sie das .frameworkaus Ihrem Finder-Fenster in den Ordner "Framework" Ihres App-Projekts.

Geben Sie hier die Bildbeschreibung ein

4) Konfigurieren Sie das App-Projekt für das Framework

  • Wählen Sie die oberste Ebene in Ihrem Projekt aus

Geben Sie hier die Bildbeschreibung ein

  • Wählen Sie Ihr Ziel

Geben Sie hier die Bildbeschreibung ein

  • Gehen Sie zu "Phasen erstellen" und dann zu "Binär mit Bibliotheken verknüpfen" und stellen Sie sicher, dass Ihr Framework mit optionaler Auswahl enthalten ist .

Geben Sie hier die Bildbeschreibung ein

  • Gehen Sie noch in "Build Phases" nach links oben und wählen Sie die +Schaltfläche. Wählen Sie in der Dropdown-Liste "Neue Phase für Kopierdateien".

Geben Sie hier die Bildbeschreibung ein

  • Scrollen Sie zum neuen Abschnitt "Dateien kopieren" und stellen Sie sicher, dass Sie Destination"Frameworks" eingestellt haben. Lassen Sie den Unterpfad leer. Klicken Sie dann +unten links auf die Schaltfläche.

Geben Sie hier die Bildbeschreibung ein

  • Sie erhalten Ihre Projekthierarchie. Scrollen Sie nach unten zu dem Ordner "Frameworks", zu dem Sie das Framework in Schritt 3 hinzugefügt haben, oder suchen Sie in der Suchleiste oben danach. Wählen Sie Ihr Framework aus und klicken Sie auf "Hinzufügen".

Geben Sie hier die Bildbeschreibung ein

  • Stellen Sie sicher, dass Ihr Framework mit "Code Sign On Copy" ausgewählt ist.

Geben Sie hier die Bildbeschreibung ein

5) Reinigen Sie Ihr Projekt und führen Sie es aus

  • COMMAND+ SHIFT+K
  • COMMAND+R
Brandon A.
quelle
5
Guter Punkt. Es funktioniert fast für mich. Ich habe ein Framework A erstellt, das Alamofire enthält. Meine Host-App (eingebettetes Framework A) funktioniert in Simulatoren. Wenn ich jedoch versuche, es auf einem echten iPhone auszuführen, stürzt es mit dem folgenden Fehler ab: Alamofire: dyld: Bibliothek nicht geladen: @ rpath / Alamofire.framework / Alamofire Grund: Kein geeignetes Bild gefunden. Habe gefunden: xxx / ddcdemo.app / Frameworks / iddc.framework / Frameworks / Alamofire.framework / Alamofire: mach-o, aber falsche Architektur
DàChún
1
@Brandon Das optionale Framework zu machen hat mein Problem gelöst. Aber können Sie mir bitte erklären, wie sich das Framework optional macht?
Mitesh Dobareeya
2
Vielen Dank! In Schritt 5 wurde "Nur bei Installation kopieren" aktiviert, und das war mein Problem.
Andi
48

Ich habe ein Framework mit Swift3 / Xcode 8.1 erstellt und es in einem Objective-C / Xcode 8.1-Projekt verwendet. Um dieses Problem zu beheben, musste ich die Always Embed Swift Standard LibrariesOption unter aktivieren Build Options.

Schauen Sie sich diesen Screenshot an:

Geben Sie hier die Bildbeschreibung ein

NeverHopeless
quelle
3
Das hat jetzt bei mir bei funktioniert. Die Lösung für dieses Problem besteht darin, unter BuildPhases -> Dateien kopieren -> Framework unter Ziel auszuwählen und Ihr Framework hinzuzufügen. Möglicherweise fehlt Ihre Bibliothek hier.
Harish
@ Harish, Die Lösung, die Sie vorschlagen, wird bereits von mehreren vorgeschlagen, und auf jeden Fall kümmere ich mich zuerst darum. In meinem Fall wurde das Framework dort hinzugefügt, aber es trat immer noch das gleiche Problem auf. Dann grabe ich es selbst. Wenn Sie diese Lösung abgelehnt haben, weiß ich nicht, warum Sie sich ziemlich sicher sind, wie es funktioniert, wenn es in meinem Fall nicht funktioniert hat: S
NeverHopeless
@ Harish Danke. Ihre Antwort hat mir viel mehr geholfen und natürlich auch NeverHopeless :) Danke euch
Mohsin Khubaib Ahmed
Dies war das einzige, was für mich funktioniert hat. Aber ich "binde" das Framework bereits in den Embedded BinariesAbschnitt meines Ziels ein . Warum funktioniert das so?
Guptron
Genial, dass dieses Ding funktioniert, wenn Sie eine schnelle Bibliothek oder einen Pod zum Einbetten in das Ziel-C-Projekt verwenden. Ziel C-Projekt hat oft diese Flagge zu Nr.
Swaroop S
47

Versuchen Sie zunächst, nach Befehl + Option + Umschalt + K zu erstellen. Wenn dies immer noch fehlschlägt, führen Sie die folgenden Schritte aus.

Wenn in Xcode 8 jemand auf diesen Fehler stößt, ändern Sie Ihren Framework-Status auf der Registerkarte "Allgemein" Ihres Ziels in " Optional" anstatt "Erforderlich".

Geben Sie hier die Bildbeschreibung ein

Wüstenrose
quelle
3
Dies wird Laufzeit machen Klassen nicht aus dem Framework zu erkennen
Tesla
@azimov ist richtig. Ich stehe im Moment vor diesem Dilemma. Erforderlich verursacht den Fehler "Bild nicht gefunden" und wenn wir versuchen, es auf optional zu setzen, stürzt es zur Laufzeit mit "nicht erkannter Auswahl" ab
Adam Mendoza
1
Obwohl sich mein Framework bereits in Link Binaries und Embed befand, musste ich noch eine Kopierphase hinzufügen. dyld: Bibliothek nicht geladen: @ rpath / AFNetworking.framework / AFNetworking Referenziert von: / Users / {User} / Library / Developer / CoreSimulator / Devices / 6833A85C-5783-45FA-A4D5-991D286B28C2 / data / Containers / Bundle / Application / B1A0A3B2-92A2-41B0-9884-6DB6995A0D7E / MyApp.app / MyApp Grund: Bild nicht gefunden (lldb) Lösung: Projekt -> Ziel -> Phasen erstellen -> + oben, um neue Phase zum Kopieren von Dateien hinzuzufügen Ziel = Frameworks Wählen Sie das Framework aus das muss kopiert werden
Adam Mendoza
@AdamMendoza Ich hatte meine App deswegen abgelehnt.
Jbouaziz
@jbouaziz, ja, ein Fehler, auf den Sie möglicherweise stoßen, ist darauf zurückzuführen, dass das .framework fett ist. Dies bedeutet, dass es neben dem erforderlichen armv7 arm64 auch Architekturen gibt, die unter iOS nicht unterstützt werden, wie z. B. i386 x86_64. Der Store gibt Ihnen einen Fehler aus, aber möglicherweise wird der Fehler in Xcode nicht angezeigt. Verwenden Sie den Loader unter Xcode -> Open Developer Tool -> Application Loader. LösungL
Adam Mendoza
28

Ich habe das gleiche Problem in der iOS 9.x-Version

PROBLEM IST: App stürzt ab, sobald ich die App mit dem folgenden Fehler öffne.

dyld: Bibliothek nicht geladen: /System/Library/Frameworks/UserNotifications.framework/UserNotifications Referenziert von: /var/containers/Bundle/Application/######/TestApp.app/TestApp Grund: Bild nicht gefunden

Ich habe dieses Problem behoben, indem ich Requiredzu Optionalin Linked Frameworks and Librariesfor UserNotifications.frameworkFramework gewechselt habe .

jfalexvijay
quelle
Das funktioniert. Weiß jemand warum? Weil einige Geräte diese Einstellung benötigen, andere nicht.
NEO
Ich erhalte die Meldung "Warnung: Supportcode zum Lesen von Objective-C-Klassendaten konnte nicht ausgeführt werden. Dies kann die Qualität der verfügbaren Typinformationen beeinträchtigen." wenn meine lib als optional markieren
BergP
Es hat funktioniert. Vielleicht liegt der Grund darin, dass ein Framework nicht im Simulator ausgeführt wurde. Deshalb
Gowtham Sooryaraj,
@ redent84 Diese Antwort hat mich zusammen mit Ihrem Kommentar davor bewahrt, verrückt zu werden. Ist auf dieses Problem mit AuthenticationServices.framework gestoßen, für das iOS 12 erforderlich ist.
Tamás Sengel
26

Ich musste (zusätzlich zu dem, was hier erwähnt wurde) die folgende Zeile zu Runpath Search Paths auf der Registerkarte Build Settings hinzufügen :
@executable_path/Frameworks

Geben Sie hier die Bildbeschreibung ein

Aviel Gross
quelle
Dies hat das Problem für mich behoben. Ich hatte das Problem, nachdem ich meiner iOS 9-App eine App-Erweiterung hinzugefügt hatte. Vor dem Hinzufügen der Erweiterung wurde mein Framework als gut befunden. Das Hinzufügen einer Erstellungsphase zum Kopieren von Dateien hat nicht geholfen, und ich habe das Framework bereits eingebettet.
Greg
Es ist so seltsam, dass dies nicht standardmäßig enthalten ist. Wenn Sie Ihre IPA entpacken und anzeigen, sollten Sie Ihre Frameworks unter Payloads / appname.app / Frameworks / finden. Das Hinzufügen dieses Suchpfads muss jedoch vorhanden sein, damit die App zur Laufzeit in diesem Ordner suchen kann. Seltsam.
Mattv123
25

Sie müssen das Framework einer neuen Erstellungsphase zum Kopieren von Dateien hinzufügen, um sicherzustellen, dass das Framework zur Laufzeit in das Anwendungspaket kopiert wird.

Siehe Wie eine ‚Kopieren von Dateien BUILD - Phase‘ zu meinem Ziel hinzuzufügen , für weitere Informationen.

Offizielle Apple-Dokumente: https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html

Liamnichole
quelle
Nachdem ich so viele Dinge ausprobiert hatte, löste dies das Problem für mich. Ich hatte bereits das Framework in Link Binary und Embed Framework. Ich dachte nicht, dass ich auch eine Kopierphase hinzufügen müsste, aber das hat es behoben.
Adam Mendoza
14

Wenn Sie Xcode 11 oder neuer verwenden :

  1. Navigieren Sie zu den Einstellungen Ihres Ziels und wählen Sie Allgemein .

Zieleinstellungen / Allgemein

  1. Scrollen Sie nach unten zu Frameworks, Bibliotheken und eingebetteten Inhalten .

  2. Stellen Sie sicher, dass der Wert Einbetten & Signieren oder Ohne Signieren einbetten für die Option Einbetten ausgewählt ist, falls erforderlich.

Abschnitt Frameworks, Bibliotheken und eingebettete Inhalte

Tamás Sengel
quelle
13

Fügen Sie das Framework in Embedded Binaries hinzu Geben Sie hier die Bildbeschreibung ein

Dann reinigen und bauen.

Vineesh TP
quelle
11

Überraschenderweise sind hier nicht alle notwendigen Teile dokumentiert, zumindest für Xcode 8.

Mein Fall war ein benutzerdefiniertes Framework als Teil desselben Arbeitsbereichs. Es stellt sich heraus, dass es falsch gebaut wurde. Basierend auf Jeremyhus letzter Antwort auf diesen Thread:

https://forums.developer.apple.com/thread/4687

Ich musste Dynamic Library Install Name Base( DYLIB_INSTALL_NAME_BASE) unter Build Settingsdem Framework- Projekt setzen und es dann neu erstellen. Es war falsch eingestellt $(LOCAL_LIBRARY_DIR)und ich musste es ändern @rpath.

In der Phase der Linkverarbeitung im App- Projekt wurde die Host-App angewiesen, das Framework zur Laufzeit dynamisch von /Library/Frameworks/fw.Framework/fw(wie im Stammverzeichnis des Laufzeit-Dateisystems) und nicht vom Pfad zur App zu laden/Frameworks/fw.Framework/fw

In Bezug auf alle anderen Einstellungen: Es muss sich an drei Stellen befinden Build Phases, aber diese werden alle gleichzeitig festgelegt, wenn Sie es einfach zur Embedded BinariesEinstellung auf der GeneralRegisterkarte der Hosting-App hinzufügen .

Ich musste keine zusätzliche Copy FilesPhase einrichten , die in Bezug auf die Einbettungsphase ohnehin intuitiv überflüssig erscheint. Indem wir das hintere Ende des Build-Transkripts überprüfen, können wir sicherstellen, dass dies nicht erforderlich ist.

PBXCp /Users/xyz/Library/Developer/Xcode/DerivedData/MyApp-cbcnqafhywqkjufwsvbzckecmjjs/Build/Products/Debug-iphoneos/MyFramework.framework

[Viele ausführliche Zeilen wurden entfernt, aber aus dem vereinfachten Transkript in der Xcode-Benutzeroberfläche geht hervor.]

Ich habe immer noch keine Ahnung, warum Xcode den DYLIB_INSTALL_NAME_BASEWert falsch auf mich eingestellt hat.

BaseZen
quelle
1
Vielen Dank, dies stellte sich als mein Problem in Xcode 11 heraus. Ich importierte eines meiner eigenen Frameworks, das zuvor funktionierte, gab jedoch den Fehler "dyld: Bibliothek nicht geladen" aus. Um dies zu verdeutlichen, möchten Sie die Build-Einstellung "Dynamic Library Install Name Base" im Projekt des Frameworks, das Sie importieren möchten, auf "@rpath" setzen, nicht in dem Projekt , in das Sie importieren. Irgendwie wurde es auf "/ Library / Frameworks" gesetzt.
Ben Stahl
Ich bin froh, dass dies 3 Jahre später hilfreich war. Entsprechend bearbeitet.
BaseZen
9

In meinem Fall bestand die Lösung darin, das kompilierte Framework aus den eingebetteten Binärdateien zu entfernen, die ein eigenständiges Projekt im Arbeitsbereich waren, es zu bereinigen und neu zu erstellen und schließlich wieder zu eingebetteten Binärdateien hinzuzufügen.

Andrea Leganza
quelle
8

Meine Umgebung: Cocos2d 2.0, Box2d, Ziel C.

Zusätzlich zu den anderen Antworten oben ging ich schließlich zur Registerkarte Allgemein und machte WatchKit optional.

Ziel Allgemein verknüpfte Frameworks und Bibliotheken Watchkit.framework Optional

Jim Rota
quelle
8

Wenn Sie ein Framework eines Drittanbieters verwenden und Cocoapods als Abhängigkeitsmanager verwenden, versuchen Sie, pod installIhre Pods zu aktualisieren .

Dieser Absturz trat in einer von mir verwendeten Drittanbieter-Bibliothek auf. Ich bin froh, dass die oben genannte Lösung für mich funktioniert hat. Ich hoffe, sie funktioniert für Sie!

NYC Tech Engineer
quelle
1
Großartig! mein Problem behoben. Aber gibt es eine Möglichkeit, die Installation von Pod-Abhängigkeiten in meiner Host-App zu vermeiden?
DàChún
8

Geben Sie hier die Bildbeschreibung ein

Für mich behoben, indem die Option "Nur bei Installation kopieren" in Build Phases-> Embed Frameworks deaktiviert wurde

Shohin
quelle
1
Es wäre schön, den Sinn dieses Kontrollkästchens zu kennen, wenn das System nicht glaubt, dass "Debug-Installation" nicht "Installation" ist. Unabhängig davon, ob es einen Absturz der App auf der Hardware verursacht, anstatt das Ausführen der App mit einer Warnung zu verbieten, ist es ein ordentlicher weiterer Xcode-Fehler
William Cerniuk
8

Es ist ein Laufzeitfehler, der durch verursacht wird Dynamic Linker

dyld: Library not loaded: @rpath/...
...
Reason: image not found

Der Fehler Library not loadedmit @rpathzeigt an, dass Dynamic Linkerdie Binärdatei nicht gefunden werden kann.

  1. Überprüfen Sie, ob das dynamische Framework hinzugefügt wurde General -> Embedded Binaries

  2. Überprüfen Sie das @rpathSetup zwischen Consumer (Anwendung) und Producer (Dynamic Framework):

    • Dynamisches Framework:
      • Build Settings -> Dynamic Library Install Name
    • Anwendung:
      • Build Settings -> Runpath Search Paths
      • Build Phases -> Embed Frameworks -> Destination, Subpath

Dynamischer Linker

Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)Dies wird von loadable bundle( Dynamic frameworkals Ableitung) verwendet, wo dyldins Spiel kommt
Dynamic Library Install Name- Pfad zur Binärdatei (nicht .framework). Ja, sie haben die gleichen Namen, aber MyFramework.frameworkein packaged bundlemit MyFrameworkBinär - Datei und Ressourcen im Innern.
Dieser Pfad zum Verzeichnis kann absolut oder relativ sein (zB @executable_path, @loader_path, @rpath). Der relative Pfad ist vorzuziehen, da er zusammen mit einem Anker geändert wird, der nützlich ist, wenn Sie Ihr Bundle als einzelnes Verzeichnis verteilen

absoluter Pfad - Framework1 Beispiel

//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1

@executable_path

@executable_path - relativ zum Eintrag binär - Framework2- Beispielanwendungsfall
: Einbetten eines Dynamic frameworkin eine Anwendung

//Application bundle(`.app` package) absolute path
/some_path/Application.аpp

//Application binary absolute path 
/some_path/Application.аpp/subfolder1

//Framework2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1

//Framework2 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1

//Framework2 Dynamic Library Install Name 
@executable_path/../Frameworks/Framework2.framework/subfolder1

//Framework2 binary resolved absolute path by dyld
/some_path/Application.аpp/subfolder1/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1

@loader_path

@loader_path - relativ zum Bundle, das Eigentümer dieses binären
Anwendungsfalls ist: Framework mit eingebettetem Framework - Framework3_1 mit Framework3_2 im Inneren

//Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1

//Framework3_2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1

//Framework3_1 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1

//Framework3_1 @loader_path == Framework3_1 @executable_path
/some_path/Application.аpp/subfolder1

//Framework3_2 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1

//Framework3_2 @loader_path == Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1

//Framework3_2 Dynamic Library Install Name 
@loader_path/../Frameworks/Framework3_2.framework/subfolder1

//Framework3_2 binary resolved absolute path by dyld
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1/../Frameworks/Framework3_2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1

@rpath - Runpath-Suchpfad

Framework2 Beispiel

Zuvor mussten wir ein Framework einrichten, um mit dyld zu arbeiten. Dies ist nicht praktisch, da dasselbe Framework nicht mit unterschiedlichen Konfigurationen verwendet werden kann

@rpath ist ein zusammengesetztes Konzept, das auf äußeren (Anwendung) und verschachtelten (Dynamic Framework) Teilen basiert:

  • Anwendung:

    • Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS)- definiert eine Liste von Vorlagen, durch die ersetzt werden soll @rpath.
       @executable_path/../Frameworks
    • Überprüfen Sie Build Phases -> Embed Frameworks -> Destination, Subpath, ob genau das eingebettete Framework vorhanden ist
  • Dynamisches Framework:

    • Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)- Punkt, @rpathder zusammen mit dem lokalen Bündelpfad zu einer Binärdatei verwendet wird
      @rpath/Framework2.framework/subfolder1
//Application Runpath Search Paths
@executable_path/../Frameworks

//Framework2 Dynamic Library Install Name
@rpath/Framework2.framework/subfolder1

//Framework2 binary resolved absolute path by dyld
//Framework2 @rpath is replaced by each element of Application Runpath Search Paths
@executable_path/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1

* ../- Wechseln Sie zum übergeordneten Verzeichnis des aktuellen Verzeichnisses

otool - Werkzeug zur Anzeige von Objektdateien

//-L print shared libraries used
//Application otool -L
@rpath/Framework2.framework/subfolder1/Framework2

//Framework2 otool -L
@rpath/Framework2.framework/subfolder1/Framework2

//-l print the load commands
//Application otool -l
LC_LOAD_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2

LC_RPATH
@executable_path/../Frameworks

//Framework2 otool -l
LC_ID_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2

install_name_tool Ändern Sie die Installationsnamen der dynamischen gemeinsam genutzten Bibliothek mithilfe von -rpath

CocoaPodsverwendet use_frameworks![About] , um a zu regulierenDynamic Linker

[Wortschatz]

yoAlex5
quelle
6

Vor kurzem ist dieses Problem beim Importieren von CoreNFC auf ältere iPhones (z. B. iPhone 6) und Xcode (11.3.1) aufgetreten. Ich konnte es zum Laufen bringen

  1. Wählen Sie in Ihren Projekten das Ziel aus.
  2. Gehen Sie oben zur Registerkarte Allgemein .
  3. Fügen Sie im Abschnitt " Frameworks, Bibliotheken und eingebettete Inhalte " das Framework hinzu (für mich war es CoreNFC). Wiederholen Sie dies für andere Ziele.
  4. Klicken Sie oben auf Phasen erstellen und erweitern Sie " Binär mit Bibliotheken verknüpfen ".
  5. Machen Sie das problematische Framework optional (von erforderlich).

Dadurch konnte ich für ältere / neuere iPhones kompilieren, ohne Codeänderungen vornehmen zu müssen. Ich hoffe das hilft anderen.

whawhat
quelle
1
VIELEN DANK. Es optional zu machen war das fehlende Glied ...
fl034
funktioniert nicht, die App stürzt ab und es wird keine Meldung angezeigt, die den Absturztyp anstelle eines Haltepunkts in einem Assemblycode angibt.
Newsonic
Warum ist dies erforderlich, um optional zu machen?
rohitwtbs vor
5

Ich hatte das gleiche Problem. Ich habe versucht, mein Projekt mit einem iPhone zu erstellen, das ich noch nie zuvor verwendet habe, und ich habe kein neues Framework hinzugefügt. Für mich hat das Aufräumen gut funktioniert ( Umschalt + Befehl + K ). Vielleicht liegt es daran, dass ich Beta 5 von Xcode 7 und ein iPhone 6 mit iOS 9 Beta verwende, aber es hat funktioniert.

henrik-dmg
quelle
Und vielleicht auch einen Clean Build Folder (CMD + Shift + Alt + K)
Grifas
4

In meinem Fall wird mein Projekt von Objective-C geschrieben und in der Bibliothek befinden sich Swift-Dateien. Daher habe ich "Always Embed Swift Standard Libraries" auf der Registerkarte " Build Settings " meines Projekts in " Yes " geändert und es wurde völlig in Ordnung.

User18474728
quelle
4

Für jedes Projekt oder Framework-Projekt in Xcode, das Pods verwendet, besteht eine einfache Möglichkeit, zu vermeiden, dass die dynamische Bibliothek (dylb) nicht geladen wird, darin, die Pod-Datei im statischen Modus auf Tinte zu setzen. Stellen Sie dazu sicher, dass Sie nicht die folgende Zeile in Ihre Pod-Datei schreiben.

use_frameworks!

Sobald die Zeile aus Ihrer gespeicherten Datei gelöscht wurde, führen Sie sie einfach über die Konsole aus:

$ pod update
Stéphane de Luca
quelle
2

Wenn Entwicklungs-Pod vorhanden ist Löschen Sie Ihre App aus dem Simulator, installieren Sie sie aus dem Pod -> Reinigen -> Führen Sie sie erneut aus ...

Rajesh Kumar
quelle
2

Das gleiche war, als ich ein neues Konfigurations- und Erstellungsschema erstellt habe.

Die Lösung für mich war also zu rennen

pod install

für diese neu erstellte Konfiguration.

atereshkov
quelle
1

Nachdem ich alle im Internet verfügbaren Methoden und meine eigenen Trial-and-Error-Tricks 100 Mal ausprobiert habe. Endlich konnte ich es lösen. - Apeksha Sahu vor 6 Minuten Gehe zu
iTunes auf dem Mac -> Konten -> Autorisiere diesen Computer - Apeksha Sahu vor 5 Minuten
Zweiter Schritt .... Gehe zum Entwickler in den Einstellungen in iPad und iPhone und indiziere alles neu mit Kennungen und klaren Vertrauenscomputern. Es hat bei mir funktioniert ........ ....... Nach der Neuinstallation von Mac OSHigh Seria 10.13.15 Version von Mac OS Seirra Beta neueste Version, um Xcode neueste Version neu zu installieren, nachdem alle Zertifikate aktualisiert wurden. etc etc etc ... so viele Methoden, wie Sie denken können, dass ich es getan habe. - -Geben Sie hier die Bildbeschreibung ein

Apeksha Sahu
quelle
1

Versuchen Sie, das Flag ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES(in früheren Xcode-Versionen :) Embedded Content Contains Swift Codein den Build-Einstellungen von NEIN auf JA zu ändern.

Vittal Pai
quelle
1

Xcode 11

  1. Navigieren Sie zu den Einstellungen Ihres Ziels und wählen Sie Allgemein.
  2. Suchen Sie nach "Frameworks, Bibliotheken und eingebetteten Inhalten".
  3. Behalten Sie "Nicht einbetten" bei und stellen Sie sicher, dass alle Ihre Ziele (wenn Sie mehr als ein Ziel haben) nur ein eigenes Framework festgelegt haben und keine anderen Ziele.
Matias Jurfest
quelle
1

In Xcode 11

Ich stand vor dem gleichen Problem

Das Ändern von "Nicht einbetten" auf der Registerkarte " Allgemein " > "Frameworks, Bibliotheken und eingebettete Inhalte" führte immer noch zu demselben Fehler.

Was für mich gelöst wurde, war das Hinzufügen des Frameworks im Abschnitt " Phasen erstellen" > " Frameworks einbetten"

--Aktualisiert---

Ich habe festgestellt, dass in Projekten, die in früheren Versionen von Xcode Embed Frameworks erstellt wurden, der Abschnitt nicht verfügbar ist, wenn er in Xcode 11 ausgeführt wird. Führen Sie die folgenden Schritte aus, um die Lösung zu erzielen:

1: Zunächst müssen die hinzufügen Neue Dateien kopieren Phase unter Build - Phasen - Registerkarte.

Geben Sie hier die Bildbeschreibung ein

2: Ändern Sie anschließend den Namen der hinzugefügten Phase in Embed Frameworks Geben Sie hier die Bildbeschreibung ein

3: Ändern Sie das Ziel in Frameworks .

Geben Sie hier die Bildbeschreibung ein

4: Fügen Sie das Framework hinzu, für das der Fehler aufgetreten ist.

Geben Sie hier die Bildbeschreibung ein

vinay
quelle
1

Zwar sagen alle, dass das Framework unter den eingebetteten Binärdateien eingebettet werden soll, aber es funktioniert immer noch nicht, da uns hier ein wichtiger Schritt fehlt.

Hier sind die beiden richtigen Schritte zum Hinzufügen der Binärdateien auf der Registerkarte Eingebettete Binärdateien:

  1. Entfernen Sie das Framework, das den Fehler verursacht, aus den "Verknüpften Frameworks und Bibliotheken" auf der Registerkarte "Allgemein".

  2. Fügen Sie nun das entfernte Framework nur unter der Registerkarte Eingebettete Binärdateien hinzu, und das ist alles, was Sie tun müssten.

Führen Sie es auf dem Gerät aus und behalten Sie das Lächeln bei;)

Manish Gupta
quelle
0
  1. Gehen Sie zu Datei in xcode -> Arbeitsbereichseinstellungen
  2. Klicken Sie auf den Pfeil, neben dem / Users / apple / Library / Developer / Xcode / DerivedData angezeigt wird
  3. Wählen Sie die abgeleiteten Daten aus und verschieben Sie sie in den Papierkorb.
  4. Beenden Sie den xcode und öffnen Sie ihn erneut.
  5. Bereinigen Sie das Projekt und führen Sie es erneut aus.

Die obigen Schritte haben meine Probleme behoben.

John Raja
quelle
-5

Falls dieses Problem immer noch auftritt, müssen Sie möglicherweise Ihr Codesignaturzertifikat wie folgt widerrufen und neu erstellen , obwohl Sie alle in den vielen anderen Antworten beschriebenen Schritte ausgeführt haben :

https://developer.apple.com/library/ios/qa/qa1886/_index.html

Sam
quelle
Genau. Die Codesignatur hat mit diesem Fehler nichts zu tun.
igraczech