673 Stimmen

IOS-App mit Framework ist auf dem Gerät abgestürzt, dyld: Bibliothek nicht geladen, Xcode 6 Beta

Dieser Absturz war ein blockierendes Problem. Ich habe die folgenden Schritte zur Reproduktion des Problems verwendet:

  • Erstellen Sie ein Cocoa Touch Framework-Projekt
  • Fügen Sie eine Swift-Datei und eine Klasse Dog hinzu
  • Erstellen Sie ein Framework für das Gerät
  • Erstellen Sie eine Single View-Anwendung in Swift
  • Importieren Sie das Framework in das App-Projekt
  • Instanziieren Sie die Swift-Klasse aus dem Framework im ViewController
  • Bauen und führen Sie eine App auf dem Gerät aus

Die App stürzte sofort beim Start ab. Hier ist der Konsolen-Log:

dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
  Referenziert von: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
  Grund: Bild nicht gefunden

Ich habe versucht, auf iOS 7.1 und 8.0 Geräten zu bauen. Sie haben beide den gleichen Absturz. Allerdings kann ich eine App erstellen und auf dem Simulator ausführen. Außerdem bin ich mir bewusst, dass ich das Framework von Erforderlich auf Optional in Link Binary With Libraries ändern kann, aber das hat das Problem nicht vollständig gelöst. Die App stürzt ab, wenn ich eine Instanz von Dog erstelle. Das Verhalten ist auf dem Gerät und dem Simulator unterschiedlich. Ich vermute, dass wir kein Framework für das Gerät mit einer Beta-Version von Xcode verteilen können. Kann jemand Licht ins Dunkel bringen?

12voto

BaseZen Punkte 8484

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

Mein Fall war ein benutzerdefiniertes Framework als Teil des gleichen Workspace. Es stellte sich heraus, dass es falsch erstellt wurde. Basierend auf jeremyhus letzter Antwort in diesem Thread:

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

Ich musste Dynamic Library Install Name Base (DYLIB_INSTALL_NAME_BASE) unter Build Settings des Framework-Projekts einstellen und dann neu erstellen. Es war falsch auf $(LOCAL_LIBRARY_DIR) gesetzt und ich musste es auf @rpath ändern.

Also in der Link-Verarbeitungsphase im App-Projekt wurde die Host-App angewiesen, das Framework zur Laufzeit dynamisch aus /Library/Frameworks/fw.Framework/fw (also dem Stamm des Laufzeitdateisystems) zu laden, anstatt aus dem Pfad-zur-App/Frameworks/fw.Framework/fw

Was die anderen Einstellungen betrifft: Es muss an 3 Stellen in Build Phases sein, aber diese werden alle gleichzeitig eingestellt, wenn Sie es einfach zur Embedded Binaries-Einstellung im General-Tab der Host-App hinzufügen.

Ich musste nicht extra eine Copy Files-Phase einrichten, was mit Blick auf die Einbettungsphase sowieso intuitiv redundant erscheint. Durch Überprüfen des Bauskriptendes können wir sicherstellen, dass dies nicht notwendig ist.

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

[Viele detaillierte Zeilen wurden entfernt, aber es ist aus dem vereinfachten Protokoll in der Xcode-Benutzeroberfläche ersichtlich.]

Ich habe immer noch keine Ahnung, warum Xcode den Wert von DYLIB_INSTALL_NAME_BASE falsch gesetzt hat.

11voto

whawhat Punkte 175

Vor kurzem bin ich bei älteren iPhones (z. B. iPhone 6) und Xcode (11.3.1) auf das Problem gestoßen, CoreNFC zu importieren. Ich konnte es zum Laufen bringen, indem ich es tat

  1. In deinen Projekten das Ziel auswählst.
  2. Gehen Sie zum oberen Tab Allgemein.
  3. Unter dem Abschnitt 'Frameworks, Libraries and Embedded Content' das Framework hinzufügen (bei mir war es CoreNFC). Wiederholen Sie dies für andere Ziele.
  4. Klicken Sie oben auf Build Phases und erweitern Sie 'Link Binary with Libraries'.
  5. Machen Sie das problematische Framework optional (statt erforderlich).

Dies ermöglichte es mir, für ältere/neuere iPhones zu kompilieren, ohne Codeänderungen vornehmen zu müssen. Ich hoffe, das hilft anderen.

10voto

Jim Rota Punkte 1773

Meine Umgebung: Cocos2d 2.0, Box2d, Objective C

Zusätzlich zu den anderen Antworten bin ich schließlich zum Allgemein-Tab gegangen und habe WatchKit Optional gemacht.

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

9voto

Andrea Leganza Punkte 412

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

8voto

NYC Tech Engineer Punkte 1775

Wenn Sie ein Framework von Drittanbietern verwenden und Cocoapods als Ihren Abhängigkeitsmanager verwenden, versuchen Sie, ein pod install zu machen, um Ihre Pods zu aktualisieren.

Dieser Absturz trat bei einer Bibliothek von Drittanbietern auf, die ich verwendete, also bin ich froh, dass die obige Lösung für mich funktioniert hat. Hoffentlich funktioniert es auch für Sie!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X