Как заставить macdeployqt изменить имена библиотек внутри QtWebEngineProcess.app, когда он копирует фреймворк QtWebEngineCore

Редактировать: используя Qt 5.9.1, установленный с помощью Homebrew

После комментария к этому другому вопросу мы пытаемся использовать macdeployqt для подготовки дистрибутива пакета OSX на основе Qt. заявление.

Этот инструмент правильно копирует все зависимости Qt (и даже некоторые библиотеки, отличные от Qt) внутри пакета. Он также изменяет имена зависимых библиотек как внутри самого приложения, так и в скопированных библиотеках.

Он также успешно копирует QtWebEngineProcess.app, содержащийся в папке Helpers файла QtWebEngineCore.framework.

Проблема

Проблема в том, что он не меняет имена зависимых библиотек внутри QtWebEngineProcess, поэтому пакет нельзя перемещать (поскольку QtWebEngineProcess ссылается на свою зависимую библиотеку абсолютными путями, допустимыми только на машине разработки). При попытке запустить приложение на «клиентской» машине можно получить ошибку:

dyld: библиотека не загружена: /usr/local/Cellar/qt/5.9.1/lib/QtWebEngineCore.framework/Versions/5/QtWebEngineCore Ссылка из: Business.app/Contents/Frameworks/QtWebEngineCore.framework/Helpers/QtWebEngineProcess.app /Содержание/MacOS/QtWebEngineProcess

Мы попытались исправить это приложение вручную, отредактировав QtWebEngineProcess, заменив абсолютную часть пути к библиотекам Qt на @loader_path/../../../../../../../../Frameworks/.

Это только продвигает проблему вперед: теперь QtWebEngineProcess, кажется, правильно загружает свои зависимые библиотеки, но сами зависимые библиотеки больше не могут загружать свои зависимые библиотеки, так как их имя установки начинается с @executable_path, а исполняемый файл QtWebEngineProcess находится в папке, отличной от исполняемого файла Business. Отсюда ошибка:

dyld: библиотека не загружена: @executable_path/../Frameworks/QtQuick.framework/Versions/5/QtQuick
Ссылка из: Business.app/Contents/Frameworks/QtWebEngineCore.framework/Versions/5/QtWebEngineCore


Не работает ли macdeployqt, когда речь идет о приложении, использующем веб-движок Qt?

Есть ли способ заставить его работать без повторного изменения всех имен установки Qt в комплекте вручную?


person Ad N    schedule 26.09.2017    source источник
comment
Не уверен, что это поможет и в вашем случае, но для моего приложения, использующего QtWebEngine, я сначала запускаю macdeployqt, а затем запускаю install_name_tool с параметром -add rpath @executable_path/../Frameworks <absolute path to app install dir>/MyApp.app/Contents/MacOS/MyApp, где MyApp.app — это имя пакета приложения, а MyApp — это имя двоичного файла приложения.   -  person Dmitry    schedule 26.09.2017
comment
@Dmitry К сожалению, как мы видим во второй ошибке, библиотеки Qt содержат имена установки для своих зависимых библиотек Qt, которые начинаются с @executable_path, а не с @rpath (это делается с помощью macdeployqt). Поэтому я думаю, что заполнение rpath приложения не должно иметь значения.   -  person Ad N    schedule 26.09.2017
comment
Я вижу, вы используете Qt, установленный через Homebrew. Вы пытались вместо этого использовать официальный установочный пакет Qt?   -  person Dmitry    schedule 26.09.2017
comment
@Dmitry Интересное предложение. На данный момент я нашел неприятный обходной путь, но официальная установка Qt — это путь для изучения, спасибо!   -  person Ad N    schedule 26.09.2017
comment
@AdN Не могли бы вы поделиться своим обходным путем в качестве ответа? Я столкнулся с той же проблемой.   -  person htzfun    schedule 06.11.2017
comment
@Dmitry Спасибо за ваше предложение, вы были правы, официальный дистрибутив Qt заставляет его работать!   -  person Ad N    schedule 20.12.2017
comment
Возможный дубликат dyld: библиотека не загружается при использовании Qt QtWebEngine   -  person skalee    schedule 11.05.2019


Ответы (3)


Следуя одному из комментариев Дмитрия к исходному вопросу, я наконец нашел время протестировать официальный дистрибутив Qt 5.9.1 для OS X, и оказалось, что он был прав. macdeployqtdistributed с официальными двоичными файлами Qt отлично обрабатывает QtWebEngineProcess.app.

Версия этой утилиты, распространяемая с homebrew установками Qt, является поддельной, по крайней мере, в 5.9.1.

person Ad N    schedule 20.12.2017

Пока что macdeployqt отлично работает для меня на локальной машине. В CI вы можете столкнуться с проблемой, когда артефакты ломаются примерно так.

Это произойдет, если вы скопируете свое приложение с cp -r или zip без опции -y, тогда все символические ссылки будут разрешены внутри приложения, и оно не будет работать, потому что будет много копий QtWebEngineProcess. Также это сломает вашу подпись, если вы подпишете приложение.

Решение состоит в том, чтобы вместо этого использовать cp -a и zip -r -y - последнее сработало для меня вместо использования плагина для артефактов.

person htzfun    schedule 06.11.2017

Я создал следующий скрипт, который исправляет эти пути с помощью install_name_tool:

#!/bin/bash
set -x -e

pushd MyApp.app/Contents/Frameworks/QtWebEngineCore.framework/Helpers/QtWebEngineProcess.app/Contents/MacOS

for LIB in QtGui QtCore QtWebEngineCore QtQuick QtWebChannel QtQml QtNetwork QtPositioning
do
    OLD_PATH=`otool -L QtWebEngineProcess | grep ${LIB} | cut -f 1 -d ' '`
    NEW_PATH="@loader_path/../../../../../../../${LIB}.framework/${LIB}"
    install_name_tool -change ${OLD_PATH} ${NEW_PATH} QtWebEngineProcess
done

popd

Обратите внимание на отсутствие кавычек вокруг ${OLD_PATH} при использовании в качестве аргумента install_name_tool. Это связано с тем, что значение OLD_PATH содержит дополнительные пробелы вокруг пути, которые не следует сохранять. Отсутствие кавычек обычно безвредно, если Qt был установлен через Homebrew, так как эти пути не содержат пробелов. Однако это можно улучшить.

Важно: этого исправления достаточно, чтобы запустить Simple Browser (из примеров Qt). Но в более сложных проектах может потребоваться больше возни.

person skalee    schedule 10.05.2019