Ich habe ein Problem mit der Bereitstellung von Qt-Frameworks mit meiner Mac-App, und ich hoffe, einige werden eine Ahnung haben, warum ich diesen Fehler erhalte, wenn ich die App auf einem sauberen Mac ausführe, also kein Entwickler-Mac.
OS: 10.7.2 und mit XCode
Fehler msg:
%Vor%Offensichtlich stimmt etwas nicht, da auf QtXml von /../Frameworks/../Frameworks verwiesen wird, das nicht existiert.
Das ist die Einrichtung: Ich habe eine Dylib, die QtCore und QtXml verwendet (nicht nach meiner Wahl, aber jetzt brauche ich diese beiden Frameworks), die Dylib wird in einem NSBundle verwendet, das von der Haupt-App geladen wird. Das Bundle befindet sich im Ressourcenordner. Die Dylib wird durch Kopieren von Dateien Build Phase in den Ordner Inhalt / Frameworks verschoben und mit otool wird der Installationsname auf (wie von Ссылка ):
%Vor%Dann werden die Qt-Frameworks nach Contents / Frameworks verschoben, und der Installationsname von is wird auf
gesetzt %Vor%und für die QtXml @executable_path /../ Frameworks / QtXml.framework / Versionen / 4 / QtXml mit Bezug auf QtCore: @executable_path /../ Frameworks / QtCore.framework / Versions / 4.0 / QtCore
Nun, wenn ich die App auf dem Entwickler mac ausführe funktioniert es klar seit Qt installiert ist, aber wenn ich auf einen sauberen Mac verschoben werde, erhalte ich die Fehlermeldung, die in der Konsolen App lesbar ist. Ich habe versucht, den ausführbaren_Pfad zu loader_path zu ändern, aber das hat nicht funktioniert. Ich habe keine Ahnung, was ich falsch mache oder warum es nicht funktioniert, und ich habe bei Google nichts gefunden, natürlich könnte ich die falschen Stellen suchen. Irgendwelche Ideen, wie man dieses Problem behebt?
Dies ist die gesamte Fehlermeldung:
MainApp: Fehlerdomäne = NSCOAErrorDomain Code = 3587 "Das Bundle "Bibliothek" konnte nicht geladen werden, da sie beschädigt ist oder fehlt notwendige Ressourcen. "
(dlopen_preflight (/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/ Inhalt / MacOS / Library): Bibliothek nicht geladen:
@ loader_path /../ Frameworks / QtCore.framework / Versionen / 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 Paket ist beschädigt oder fehlt resources., NSLocalizedRecoverySuggestion = Versuchen Sie, das Programm erneut zu installieren bündeln., NSFilePath = / Benutzer / someUser / Downloads / MainApp.app / Inhalte / Ressourcen / Lib / Library.bundle / Inhalte / MacOS / Library, NSDebugDescription = dlopen_preflight (/ Benutzer / someUser /Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/Library): Bibliothek nicht geladen: @ loader_path /../ Frameworks / QtCore.framework / Versionen / 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 = / Benutzer / someUser / Downloads / MainApp.app / Contents / Resources / Lib / Library.bundle, NSLocalizedDescription = Das Paket "Library" konnte nicht geladen werden, weil Es ist beschädigt oder fehlende Ressourcen.}
AKTUALISIEREN
Wie gesagt, das Kompilieren von QT zu statischen Bibliotheken ist der Weg zu gehen. Mit der Veröffentlichung von Mavericks (10.9) müssen wir auch Frameworks signieren ( Ссылка ) ), und mit QT4.8.5 gibt es einige Probleme ( Ссылка ). Selbst mit den vorgeschlagenen Korrekturen hatte ich immer noch Probleme, wenn ich die App auf einem sauberen Rechner laufen ließ. Aus diesem Grund habe ich Qt5.2 zu statischenLibs kompiliert, sie in der App verlinkt und sie mit einem Code versehen.
OLD
Problem gelöst, ich habe die Qt-Frameworks in das App-Bundle in Contents / Frameworks verschoben und mit otool den Pfad auf @executable_path/../Frameworks
gesetzt, also aus meinem Bibliothekspaket entfernt. Ja, die Lösung ist einfach, aber ich bin mir immer noch nicht sicher, warum die ausführbare Bibliothek die Frameworks bei Verwendung von @loader_path nicht finden konnte.
Die beste Lösung wäre wahrscheinlich, eine statische Bibliothek zu verwenden und sie nicht in ein Bündel zu verpacken ... lernen Sie jeden Tag;)
Auf dem Entwicklungs-Mac funktioniert alles, weil die Qt-Bibliotheken installiert sind. Auf jedem Mac, zu dem Sie die App liefern, wird dies wahrscheinlich nicht der Fall sein. Die Qt-Suite enthält ein Tool namens macdeployqt
, um dies zu beheben. Also, in einem Terminal, nachdem Sie Ihre Anwendung kompiliert haben, tun Sie etwas wie:
Beachten Sie, dass es auch zum Erstellen einer .dmg-Datei verwendet werden kann, um alles zusammen zu versenden:
%Vor%Sobald Sie das erledigt haben, können Sie das .app-Verzeichnis oder die .dmg-Datei an eine andere Person weitergeben, ohne dass Qt installiert ist, um sie wie gewohnt zu verwenden und auszuführen.
Der einzige Nachteil ist, dass das nächste Mal, wenn Sie versuchen, es auf Ihrem Entwicklungscomputer auszuführen, sich möglicherweise mehrere gemeinsam genutzte Bibliotheken beschweren. Also, wenn du es irgendwo anders kopiert hast, um es zu verteilen, entferne das gesamte .app-Verzeichnis und lass qtcreator (oder was auch immer) es neu erstellen.
Tags und Links qt macos deployment