Die Bereitstellung von Qt-Frameworks mit der Mac-app und die Verwendung von otool
Ich habe ein problem der Bereitstellung von Qt-frameworks mit meinem Mac-app, und ich hoffe, einige von Ihnen haben eine Ahnung, warum bekomme ich diese Fehlermeldung, wenn ich die app starte auf der sauberen Mac, also keine Entwickler-Mac.
OS: 10.7 .2 und Verwendung von XCode
Error msg:
Library not loaded: @loader_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
Referenced from:/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml
Klar, so etwas ist falsch, da der QtXml ist aus verwiesen /../Frameworks/../Frameworks, die nicht existiert.
Dies ist der Aufbau: ich habe eine dylib verwendet QtCore und QtXml (nicht durch meine Wahl, aber jetzt muss ich diese beiden frameworks), die dylib ist in einem NSBundle, die geladen wird, indem die Haupt-app, das bundle befindet sich im resource Ordner. Die dylib verschoben wird, die durch Kopieren von Dateien Build-Phase in den Ordner Contents/Frameworks und mit otool die install_name festgelegt ist (wie bereits von http://doc.qt.digia.com/4.3/deployment-mac.html):
@loader_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
@loader_path/../Frameworks/QtXml.framework/Versions/4/QtXml
dann die Qt-frameworks verschoben Contents/Frameworks und der install_name der festgelegt ist:
@executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
und für die QtXml
@executable_path/../Frameworks/QtXml.framework/Versions/4/QtXml
mit Verweis auf QtCore:
@executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
Nun, wenn ich die app starte, auf der Entwickler-mac es ganz offensichtlich funktioniert, da Qt installiert ist, aber wenn Sie verschoben, um eine saubere mac bekomme ich die Fehlermeldung msg, lesbar in der Konsole app.
Ich habe versucht, ändern Sie die executable_path zu loader_path, aber das hat nicht funktioniert.
Ich habe keine Ahnung, was ich falsch mache oder warum es nicht für, und nicht in der Lage gewesen, irgendetwas zu finden auf Google, natürlich, ich könnte auf der Suche an den falschen stellen. Irgendwelche Ideen, wie man dieses problem beheben?
Das ist die gesamte Fehlermeldung:
MainApp: Error Domain=NSCocoaErrorDomain Code=3587 "bundle
"Bibliothek" konnte nicht geladen werden, da es beschädigt ist oder fehlt
die nötigen Ressourcen."
(dlopen_preflight(/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Bibliothek.bundle/
Contents/MacOS/Bibliothek): Bibliothek nicht geladen werden:
@loader_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
Referenziert von: /Users/someUser /Downloads/
MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml
Grund: Bild nicht gefunden) UserInfo=0x107c5d5d0
{NSLocalizedFailureReason=Das bundle fehlt oder beschädigt ist notwendig
Ressourcen., NSLocalizedRecoverySuggestion=Versuchen Sie die
bundle.,
NSFilePath=/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/Library,
NSDebugDescription=dlopen_preflight(/Users/someUser
/Downloads/MainApp.app/Contents/Resources/Lib/Bibliothek.bundle/Contents/MacOS/Bibliothek):
Bibliothek nicht geladen werden:
@loader_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
Referenziert von:
/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml
Grund: Bild nicht gefunden
NSBundlePath=/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Bibliothek.bundle,
NSLocalizedDescription=Das bundle "Bibliothek" konnte nicht geladen werden, da
es ist beschädigt, oder fehlen die nötigen Ressourcen.}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf die Entwicklung mac alles funktioniert, da die Qt-Bibliotheken installiert sind. Auf jedem mac versenden Sie die app, obwohl dies wahrscheinlich nicht der Fall sein. Die Qt-suite kommt mit einem tool namens
macdeployqt
dieses Problem zu beheben. So in einem terminal, nachdem Sie kompiliert haben Ihre Anwendung, etwas zu tun:Beachten Sie, dass es kann auch verwendet werden, zu erstellen .dmg-Datei für den Versand alles zusammen:
Sobald Sie das getan haben, die .app-Verzeichnis oder .dmg-Datei kann angegeben werden, um jemand anderes ohne Qt verwenden installiert und laufen als Sie normal würde.
Die einzige Einschränkung ist, dass das nächste mal, wenn Sie versuchen, führen Sie es auf Ihrer Entwickler-Maschine, es beschwert sich möglicherweise über mehrere shared-libraries installiert. So dass, sobald Sie Sie kopiert haben, wo sonst, um es zu verteilen, entfernen Sie die gesamte .app-Verzeichnis und lassen Sie qtcreator (oder was auch immer) wieder aufbauen.
UPDATE
Wie gesagt kompilieren von QT, um statische libs ist der Weg zu gehen. Mit der Veröffentlichung von Mavericks (10.9) wir müssen codesign-frameworks sowie (http://furbo.org/2013/10/17/code-signing-and-mavericks/), und mit QT4.8.5 es gibt einige Probleme (https://bugreports.qt-project.org/browse/QTBUG-32896). Auch mit den vorgeschlagenen Korrekturen hatte ich noch einige Probleme beim ausführen der app auf einer sauberen Maschine. Daher landete ich mit Qt5 kompilieren.2 staticlibs, verknüpfen Sie die app, und codesign Sie.
ALTEN
Problem sovled, zog ich die Qt-frameworks in der app-bundle in Contents/Frameworks und mit otool den Pfad zu
@executable_path/../Frameworks
, also zog Sie es aus "meine Bibliothek" - bundle. Ja die Lösung ist einfach, aber ich bin mir immer noch nicht sicher, warum die Bibliothek ausführbare Datei konnte nicht finden, dass die Rahmenbedingungen bei der Verwendung von @loader_path.Die beste Lösung wäre wahrscheinlich die Verwendung einer statischen Bibliothek und nicht wickeln Sie es in einem bundle...lernen Sie, jeden Tag 😉