Развертывание Qt Frameworks с приложением Mac и использование otool - PullRequest
9 голосов
/ 30 января 2012

У меня проблема с развертыванием фреймворков Qt с моим приложением Mac, и я надеюсь, что некоторые из них поймут, почему я получаю эту ошибку, когда запускаю приложение на чистом Mac, то есть не для разработчика Mac.

ОС: 10.7 .2 и использование XCode

Сообщение об ошибке:

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

Очевидно, что что-то не так, поскольку на QtXml ссылаются из /../Frameworks/../Frameworks, которого не существует.

Это настройка: у меня есть dylib, который использует QtCore и QtXml (не по моему выбору, но сейчас мне нужны эти две платформы), dylib используется в NSBundle, который загружается основным приложением, комплект находится в папке ресурсов. Dylib перемещается посредством фазы копирования файлов в папку Contents / Frameworks, а с помощью otool имя_установки устанавливается в (как указано 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

затем каркасы Qt перемещаются в Contents / Frameworks, и для install_name of устанавливается значение:

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

и для QtXml @executable_path /../ Каркасы / QtXml.framework / Версии / 4 / QtXml со ссылкой на QtCore: @executable_path /../ Каркасы / QtCore.framework / Версии / 4,0 / QtCore

Теперь, когда я запускаю приложение на Mac разработчика, оно четко работает, так как Qt установлен, но при перемещении на чистый Mac я получаю сообщение об ошибке, читаемое в Консольном приложении. Я пытался изменить путь к исполняемому файлу на loader_path, но это не помогло. Я понятия не имею, что я делаю неправильно или почему это не сработает, и я не смог найти что-либо в Google, конечно, я мог искать неправильные места. Есть идеи как решить эту проблему?

Это полное сообщение об ошибке:

MainApp: Ошибка домена = NSCocoaErrorDomain Code = 3587 "Пакет «Библиотека» не может быть загружена, потому что она повреждена или отсутствует необходимые ресурсы. "
(Dlopen_preflight (/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/ Содержание / MacOS / Библиотека): библиотека не загружена:
@loader_path /../ Каркасы / QtCore.framework / Версии / 4,0 / QtCore Ссылка на: / Users / someUser / Downloads / MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml Причина: изображение не найдено) UserInfo = 0x107c5d5d0 {NSLocalizedFailureReason = Пакет поврежден или отсутствует необходимый resources., NSLocalizedRecoverySuggestion = Попробуйте переустановить расслоение., NSFilePath = / Users / someUser / Загрузки / MainApp.app / Содержание / Ресурсы / Lib / Library.bundle / Содержание / MacOS / Библиотека, NSDebugDescription = dlopen_preflight (/ Users / someUser /Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/Library): Библиотека не загружена: @loader_path /../ Каркасы / QtCore.framework / Версии / 4,0 / QtCore
Ссылка от: /Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml Причина: изображение не найдено, NSBundlePath = / Users / someUser / Загрузки / MainApp.app / Содержание / Ресурсы / Lib / Library.bundle, NSLocalizedDescription = Пакет «Библиотека» не может быть загружен, потому что он поврежден или отсутствует необходимый ресурс.}

Ответы [ 2 ]

6 голосов
/ 30 января 2012

На маке разработки все работает, потому что установлены библиотеки Qt. На любом Mac, к которому вы отправляете приложение, это, вероятно, не будет иметь место. В комплект Qt входит инструмент под названием macdeployqt, чтобы это исправить. Поэтому в терминале, после того как вы скомпилировали свое приложение, сделайте что-то вроде:

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

Обратите внимание, что его также можно использовать для создания файла .dmg для отправки всего вместе:

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

Как только вы это сделаете, каталог .app или файл .dmg могут быть переданы кому-либо еще без установленного Qt для использования и запуска как обычно.

Единственное предостережение в том, что в следующий раз, когда вы попытаетесь запустить его на своем компьютере разработчика, он может жаловаться на несколько установленных общих библиотек. Поэтому, как только вы скопировали его в другое место, чтобы его распространить, удалите весь каталог .app и позвольте qtcreator (или какому-то другому) перестроить его.

3 голосов
/ 05 марта 2012

ОБНОВЛЕНИЕ

Как уже говорилось, компиляция QT в статические библиотеки - это путь.С выпуском Mavericks (10.9) нам также нужно кодировать фреймворки (http://furbo.org/2013/10/17/code-signing-and-mavericks/),, а с QT4.8.5 есть некоторые проблемы (https://bugreports.qt -project.org / browse / QTBUG-32896 * 1009)*). Даже с предлагаемыми исправлениями у меня все еще были некоторые проблемы при запуске приложения на чистой машине. Поэтому я закончил с компиляцией Qt5.2 для staticlibs, связал их в приложении и присвоил им кодовый знак.

OLD

Проблема решена, я переместил Qt-framework в комплект приложений в Contents / Frameworks и с помощью otool установил путь на @executable_path/../Frameworks, т.е. переместил его из моего комплекта библиотеки.Да, решение простое, но я все еще не уверен, почему исполняемый файл библиотеки не может найти фреймворки при использовании @ loader_path.

Лучшим решением, вероятно, будет использование статической библиотеки, а не ее перенос впучок ... ты учишься каждый день;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...