macos qt deployment

macos - Implementación de Qt Frameworks con la aplicación Mac y uso de otool



deployment (2)

En el Mac de desarrollo, todo funciona porque las bibliotecas Qt están instaladas. Sin embargo, en cualquier Mac para el que envíe la aplicación, probablemente este no sea el caso. La suite Qt viene con una herramienta llamada macdeployqt para arreglar esto. Entonces en una terminal, después de compilar su aplicación, haga algo como:

# cd my-cool-app-Desktop # macdeployqt my-cool-app.app

Tenga en cuenta que también se puede usar para crear un archivo .dmg para enviar todo junto:

# cd my-cool-app-Desktop # macdeployqt my-cool-app.app -dmg

Una vez que hayas hecho eso, el directorio .app o el archivo .dmg se pueden dar a alguien más sin Qt instalado para usar y ejecutar como lo harían normalmente.

La única advertencia es que la próxima vez que intente ejecutarlo en su máquina de desarrollo, puede quejarse de que se han instalado varias bibliotecas compartidas. Entonces, una vez que lo haya copiado, para poder distribuirlo, elimine todo el directorio .app y deje que qtcreator (o lo que sea) lo reconstruya.

Tengo un problema al implementar Qt frameworks con mi aplicación Mac, y espero que algunos tengan una idea de por qué me aparece este error cuando ejecuto la aplicación en Mac limpio, es decir, no en un Mac desarrollador.

Sistema operativo: 10.7 .2 y el uso de XCode

Mensaje de error:

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

Claramente, algo está mal ya que el QtXml se referencia desde /../Frameworks/../Frameworks, que no existe.

Esta es la configuración: tengo un dylib que usa QtCore y QtXml (no por mi elección, pero por ahora necesito esos dos frameworks), el dylib se usa en un NSBundle, que es cargado por la aplicación principal, el paquete es ubicado en la carpeta de recursos. El archivo dylib es movido por Copy Files Build Phase a la carpeta Contents / Frameworks y con otool el nombre de instalación está configurado a (como se indica en 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

luego, los marcos de Qt se mueven a Contenido / Marcos y el nombre de instalación de está configurado a:

@executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore

y para QtXml @executable_path /../ Frameworks / QtXml.framework / Versions / 4 / QtXml con referencia a QtCore: @executable_path /../ Frameworks / QtCore.framework / Versions / 4.0 / QtCore

Ahora, cuando ejecuto la aplicación en el Mac desarrollador, claramente funciona desde que Qt está instalado, pero cuando lo muevo a un mac limpio obtengo el mensaje de error, que se puede leer en la aplicación de la Consola. Intenté cambiar el executable_path por loader_path, pero esto no funcionó. No tengo idea de qué estoy haciendo mal o por qué no va a ser así, y no he podido encontrar nada en Google, por supuesto que podría estar buscando los lugares equivocados. Algunas ideas sobre cómo solucionar este problema?

Este es el mensaje de error completo:

MainApp: dominio de error = NSCocoaErrorDomain Code = 3587 "El paquete" Biblioteca "no se pudo cargar porque está dañado o porque faltan recursos necesarios."
(dlopen_preflight (/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/ Contents / MacOS / Library): Biblioteca no cargada:
@loader_path /../ Frameworks / QtCore.framework / Versions / 4.0 / QtCore Remitido desde: / Users / someUser / Downloads / MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/ ../Frameworks/QtXml.framework/Versions/4/QtXml Motivo: no se ha encontrado la imagen) UserInfo = 0x107c5d5d0 {NSLocalizedFailureReason = El paquete está dañado o faltan recursos necesarios., NSLocalizedRecoverySuggestion = Intente reinstalar el paquete., 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/Library.bundle/Contents/ MacOS / Library): Biblioteca no cargada: @loader_path /../ Frameworks / QtCore.framework / Versions / 4.0 / QtCore
Remitido desde: /Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml Motivo: imagen no encontrado, NSBundlePath = / Users / someUser / Downloads / MainApp.app / Contents / Resources / Lib / Library.bundle, NSLocalizedDescription = El paquete "Biblioteca" no se pudo cargar porque está dañado o porque faltan recursos necesarios.}


ACTUALIZAR

Como se dijo, compilar QT para libs estáticos es el camino a seguir. Con el lanzamiento de Mavericks (10.9) necesitamos también frameworks de código ( http://furbo.org/2013/10/17/code-signing-and-mavericks/ ), y con QT4.8.5 hay algunos problemas ( https://bugreports.qt-project.org/browse/QTBUG-32896 ). Incluso con las soluciones sugeridas todavía tenía algunos problemas al ejecutar la aplicación en una máquina limpia. Por lo tanto, terminé compilando Qt5.2 para staticlibs, los vinculé a la aplicación y los códifiqué.

ANTIGUO

Problema sovled, moví las Qt-frameworks en el paquete de aplicaciones en Contents / Frameworks y con otool establecí la ruta a @executable_path/../Frameworks , es decir, lo saqué de mi paquete de bibliotecas. Sí, la solución es simple, pero todavía no estoy seguro de por qué el ejecutable de la biblioteca no pudo encontrar los marcos al usar @loader_path.

La mejor solución probablemente sea usar una biblioteca estática y no envolverla en un paquete ... aprende todos los días;)