Как развернуть Assistant с моим приложением на Mac без развертывания нескольких копий Qt Frameworks?

Я пытаюсь развернуть приложение Qt, которое использует Assistant для отображения справки на Mac (OS X 10.6-10.9, Qt 4.8)

QStringList args = "-collectionFile " + "my_help_file";
QString app = "path/"+"Assistant.app";
m_helpProcess->start(app, args);

Я поместил Assistant.app в папку ресурсов.

Поскольку я развернул приложение в системе без установленного qt, я поместил все зависимости QT в Contents/Frameworks и запустил install_name_tool

# for QtCore:
install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Version/QtCore.framework/Versions/4/QtCore xxx.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore
install_name_tool -change QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore xxx.app/Contents/MacOs/xxx

install_name_tool -change QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore xxx.app/Contents/Resources/Assistant.app/Contents/MacOS/Assistant

Приложение получает его, оно функционально, но Assistant нет... очевидно, это другой уровень.

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

Вызов помощника без пакета не работал... (Я хотел бы разместить исполняемый файл рядом с исполняемым файлом xxx)

Так как я предполагаю, что я установил идентификатор для Frameworks как один каталог по сравнению с @executable_path, я не могу сказать, чтобы помочь искать в другом месте...

Как правильно связать Ассистента с Каркасами?

Примечание: я пробовал:

# for QtCore:
install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Version/QtCore.framework/Versions/4/QtCore xxx.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore
install_name_tool -change QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore xxx.app/Contents/MacOs/xxx

install_name_tool -change QtCore.framework/Versions/4/QtCore @executable_path/../../../Frameworks/QtCore.framework/Versions/4/QtCore xxx.app/Contents/Resources/Assistant.app/Contents/MacOS/Assistant

Не нашел библиотек... Я думаю, идентификатор должен соответствовать пути... но для одного экземпляра библиотеки просто не может...

Я также попытался сделать символическую ссылку (псевдоним?) На библиотеку Qt в том месте, где будет искать помощник... Он попытался и потерпел неудачу, жалуясь на неверно сформированный файл.

Обновление, чтобы ответить на комментарий:

Запуск otool -L на помощнике в комплекте помощника в папке "Ресурсы":

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

И Ассистент не может найти библиотеку, которая действительно находится в

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

1 ответ

Решение

Неожиданно помощник открылся правильно даже из-за пределов Создателя QT. Однажды я дал абсолютному пути и помощнику, и файлу ресурса. (Я мог бы сделать это либо для исполняемого файла Assistant, либо для всего пакета)

Я скопировал исполняемый помощник в ту же папку, что и исполняемый файл приложения.

Конечно, добавление зависимых библиотек и установка путей к @executable_path/../Frameworks требовались, как и для развертывания любого приложения. (Я просто сделал это вручную, а не с macdeployqt, потому что macdeployqt не смог скопировать плагины)

И что очень важно, нужно было получить плагин sqldrivers, необходимый для помощника. И... это было непросто... установить зависимости для плагина от Frameworks.

Было бы замечательно иметь помощника в его собственном пакете (внутри ресурсов)... но с зависимостями библиотеки Qt, по-прежнему находящимися в ресурсах основного пакета, чтобы избежать многократного копирования одних и тех же библиотек. Я не смог этого сделать. Размещение каркасов Qt за пределами пакета не было вариантом, так как я не могу полагаться на то, что пользователи не будут удалять элементы или устанавливать другие версии.

Другие вопросы по тегам