2016-06-08 9 views
5

Eine Bibliothek, die ich gerade verwendet habe, wurde als .framework in die Distribution verschoben.Verwenden von CMake zum Kopieren von .frameworks in iOS App-Bundle

In meiner vorhandenen CMake-Datei, ich habe bei bekommt es erfolgreich mit meinem iOS-App zu verknüpfen, aber bin immer:

dyld: Library not loaded: @rpath/Pizza.framework/Pizza 
    Referenced from: /var/mobile/Containers/Bundle/Application/D71ED298-C287-4B2F-8AFA-710A14C06D75/pizzashop.app/pizza 
    Reason: image not found 

, wenn ich es von Xcode installieren. Wenn ich es manuell zu meinem Xcode Projekt hinzufügen, in dem „embedded Binärdateien“ Abschnitt dann gut, ich bin (siehe Bild unten)

enter image description here

So habe ich festgestellt, dass das Problem die .framework sich einlässt Mein App-Paket. Ich bin auf this question gestoßen und habe mir das verlinkte QT-Beispiel angesehen, aber ich versuche mich immer noch hier zu orientieren, da ich die Syntax ein wenig undurchsichtig finde.

Ist CMake's BundleUtilities, was ich hier verwenden möchte? Bei der Betrachtung der BundleUtilities Beispiel bin ich ein wenig verloren:

set(APPS ...) # paths to executables 
set(DIRS ...) # directories to search for prerequisites 
INSTALL(CODE " 
    include(BundleUtilities) 
    fixup_bundle(\"${APPS}\" \"\" \"${DIRS}\") 
    " COMPONENT Runtime) 

Ist das OSX-spezifische oder kann ich es gelten in ähnlicher Weise auf iOS?

+1

Ich habe das gleiche Problem. Soweit ich weiß, sollte FIXUP_BUNDLE dafür ideal sein. Es sieht jedoch nicht so aus, als ob es für iOS-Bundle-Layouts entwickelt wurde. –

+0

@EmilStyrke es war auf meiner TODO-Liste für eine Weile, um die Antwort zu posten, Ihre Schmerzen hat mich angespornt, es in Priorität zu verschieben :) –

Antwort

2

Wir haben am Ende nicht eine ideale Lösung zu finden, und am Ende Dinge zu tun, ein bisschen mehr manuell als bevorzugt:

  1. Wir einen benutzerdefinierten Befehl haben wir ausführen, nachdem der Bau abgeschlossen ist, aber bevor es ist verpackt (siehe CMake add_custom_command).

  2. Der benutzerdefinierte Befehl bewirkt Folgendes:

    • erstellt ein Frameworks Verzeichnis unter unserem App Bundle-Ordner (stellen Sie sicher, dass es irgendwo ist, wo wird es in Ihrem Verpackungsprozess kopiert werden).
    • wir cp -aH verwenden, um alle Frameworks in diese kopieren Frameworks Verzeichnis
    • wir dann jeden Rahmen in diesem Verzeichnis neu signieren mit: codesign --force --verbose Computers.framework --sign "$2"
  3. Fügen Sie den Frameworks-Verzeichnis auf Ihre Suchpfade: set_target_properties(${EXE_NAME} PROPERTIES XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks")

+0

Danke! Dies ist sehr ähnlich zu dem, was ich getan habe, aber ich musste auch das Bundle selbst neu signieren, da nachfolgende Builds das Bündelsignieren zu überspringen scheinen, aber trotzdem den benutzerdefinierten Befehl ausführen. Nicht sicher, ob dies ein Problem mit CMake oder XCode ist. –

+0

Was ist das *** $ 2 *** nach dem '--zeichen'? – Itachi

+0

Ihre Signatur ID. –