Qt 5.1 и Mac: ошибка в том, что macdeployqt не работает должным образом
У меня есть проблема с версии 5.1rc2
для Qt
для Mac OS X. (5.1 также затронута, а не 5.1rc1)
Когда я создаю свое приложение и делаю otool -L
в двоичном файле, чтобы увидеть пути к разделяемым библиотекам, я получаю: (это просто образец, я удалил некоторые из них для ясности)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit
(compatibility version 45.0.0, current version 1187.37.0)
/Users/chris/**Qt5.1.0//5.1.0**/clang_64/lib/QtWebKitWidgets.framework/Versions/5/QtWebKitWidgets
(compatibility version 5.1.0, current version 5.1.0)
/Users/chris/Qt5.1.0//5.1.0/clang_64/lib/QtQuick.framework/Versions/5/QtQuick
(compatibility version 5.1.0, current version 5.1.0)
/Users/chris/Qt5.1.0//5.1.0/clang_64/lib/QtQml.framework/Versions/5/QtQml
(compatibility version 5.1.0, current version 5.1.0)
/Users/chris/Qt5.1.0//5.1.0/clang_64/lib/QtNetwork.framework/Versions/5/QtNetwork
(compatibility version 5.1.0, current version 5.1.0)
/Users/chris/Qt5.1.0//5.1.0/clang_64/lib/QtCore.framework/Versions/5/QtCore
(compatibility version 5.1.0, current version 5.1.0)
/Users/chris/Qt5.1.0//5.1.0/clang_64/lib/QtGui.framework/Versions/5/QtGui
(compatibility version 5.1.0, current version 5.1.0)
Как вы видите, в путях библиотек Qt имеется двойная косая черта.
Когда я использую macdeployqt для развертывания моего приложения, эти пути не меняются на локальные фреймворки (@executable_path/../Frameworks/...), из-за этого...
Я должен сделать это вручную с помощью install_name_tool, и это действительно раздражает.
Что я могу сделать, чтобы исправить это? (Я попытался повторно установить Qt, очистить, снова запустить qmake и перестроить без изменений)
Ответы
Ответ 1
с той же проблемой. Я применил следующее обходное решение:
после того, как я создаю свою программу, я изменил ссылки внутри exe на нужные.
install_name_tool -change /Users/username/Qt5.1.0//5.1.0/clang_64/lib/QtQuick.framework/Versions/5/QtQuick /Users/username/Qt5.1.0/5.1.0/clang_64/lib/QtQuick.framework/Versions/5/QtQuick <YourExecutable>
После этого решения macdeployqt изменил все ссылки внутри exe на относительные.
Но мое приложение разбилось. Дело в том, что я добавил все мои изображения и файлы QML в ресурсы. После запуска macdeployqt - я не могу запустить свое приложение. Когда я запускал это с помощью gdb - я вижу следующую ошибку:
QQmlApplicationEngine failed to load component
qrc:/qml/main.qml:-1 File not found
Error: Your root item has to be a Window.
Так почему-то все мои ресурсы стали недоступными. Кто-нибудь знает, как это исправить?
Я также начал обсуждение qt forum
ОБНОВЛЕНИЕ, КАК ОТКРЫТЬ:
-
Используйте этот script, чтобы избавиться от двойных косых черт внутри динамических путей ссылок.
./fixqt.sh ~/Qt5.1.0/5.1.0/clang_64
-
Создайте инструмент macdeployqt из этого репозитория.
-
Запустите macdeployqt и укажите dir с вашим источником qml:
macdeployqt MyApp.app/-qmldir =../src/qml -dmg
После этих шагов мне удалось запустить мое приложение в другой системе OS X без установки QT. Я добавил все свои qml файлы и изображения в ресурсы. Модули QtQuick и QtQuick.2, скопированные внутри MyApp.app/Content/MacOS/
Надеюсь, что это поможет
Ответ 2
Я отправляю это как решение, так как просто потерял (другой) день для этого процесса с 5.3 (и я предполагаю, что он одинаковый для 5.4).
macdeployqt
теперь работает так, как предполагалось, но неудачная часть документации здесь заключается в том, что вам нужно указать и абсолютный путь для каждого qml-каталога (относительный может работать, но мне вообще не повезло).
Вот как я решил это для моего процесса выпуска:
В файле проекта у меня теперь есть
mac {
CONFIG += x86
CONFIG += c++11
#Disable these for development
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9 #I'm not sure I need this
QMAKE_POST_LINK = {path to macdeployqt}/macdeployqt {appname}.app -qmldir=$$PWD/qml/{appname}/ -verbose=3
}
Это эффективно вызывает:
macdeployqt appname.app - /path/to/source/code/appname/qml/appname/ -verbose=3
Когда указан абсолютный путь, он работает нормально, но когда я использую относительный путь, я сталкиваюсь с несколькими проблемами. PWD
- это исходный каталог, и исполняемые файлы запускаются из каталога сборки. Абсолютным путем построения является OUT_PWD
.
Красота сохранения этого в конфигурации выпуска в проекте заключается в том, что я нормально отлаживаю (нет пакета приложений), и пакет выпуска правильно строится от создателя. Теоретически я могу просто обернуть это в сборник Дженкинса и сделать это с этой головной болью раз и навсегда.
Короткий ответ
macdeployqt
ДОЛЖЕН СКАЗАТЬ ваши файлы qml, если вы используете их, иначе импорт будет нарушен, и вы увидите ошибки, например:
QQmlApplicationEngine failed to load component
qrc:/qml/LightAssistant.qml:5 module "QtQuick.Dialogs" is not installed
qrc:/qml/LightAssistant.qml:3 module "QtQuick.Window" is not installed
qrc:/qml/LightAssistant.qml:4 module "QtQuick.Controls" is not installed
qrc:/qml/LightAssistant.qml:1 module "QtQuick" is not installed
qrc:/qml/LightAssistant.qml:2 module "QtQuick.Layouts" is not installed
Наконец, моя структура каталогов выглядит так:
Project
- qml
- appname
files1.qml
files2.qml
...
filesX.qml
- js
- images
Затем они упаковываются в файл ресурсов, который по определению не копируется в каталог сборки и, следовательно, macdeployqt не может сканировать их, если траектория не идеальна. Используя этот процесс сборки, у меня есть шаг в моей сборке (выпуске), который только что с ним связан, и мне не нужно запускать macdeployqt
, когда я отлаживаю. Имейте в виду, если вы используете app_bundle, вам нужно запустить macdeployqt для каждой сборки, которая действительно будет работать с вашим рабочим процессом отладки.
Ответ 3
Этот поток:
http://www.qtcentre.org/threads/55277-Qt-5-1-and-Mac-Bug-making-macdeployqt-not-working-properly
содержит эту ссылку:
https://gist.github.com/lasconic/5965542
к этому script по lasconic (не моя работа):
BIN_FILE=YOURBINARY
for P in `otool -L $BIN_FILE | awk '{print $1}'`
do
if [[ "$P" == *//* ]]
then
PSLASH=$(echo $P | sed 's,//,/,g')
install_name_tool -change $P $PSLASH $BIN_FILE
fi
done
QTDIR=$1
for F in `find $QTDIR/lib $QTDIR/plugins $QTDIR/qml -perm 755 -type f`
do
for P in `otool -L $F | awk '{print $1}'`
do
if [[ "$P" == *//* ]]
then
PSLASH=$(echo $P | sed 's,//,/,g')
install_name_tool -change $P $PSLASH $F
fi
done
done
Вам просто нужно заменить YOURBINARY
на, например. myapp.app/Contents/MacOS/myapp
И QTDIR=$1
с QTDIR=/Users/MyName/Qt5.1.0/5.1.0/clang_64
Сохраните файл в том же каталоге, что и myapp.app
И запустите его с помощью
sh thankslasconic.sh
то вы можете запустить
macdeployqt myapp.app
и он должен работать. Для меня это было так. Вот почему я размещаю его здесь.
Ответ 4
Я думаю, что это ошибка установщика. Все библиотеки и инструменты (скомпилированные/связанные установщиком?), Ссылающиеся на... /Qt 5.1.0//5.1.0/... (с двойной косой чертой)
Я пробовал онлайн и автономный установщик для Mac с тем же результатом.
Я сообщил об этом как об ошибке.
https://bugreports.qt-project.org/browse/QTBUG-32467
Ответ 5
В качестве продолжения эта ошибка, как представляется, исправлена в Qt5.1.1
https://bugreports.qt.io/browse/QTBUG-32365
Ответ 6
Взгляните на этот сайт http://www.stringcat.com/company_blog/2013/07/04/failed-to-load-platform-cocoa/
См. https://subversion.assembla.com/svn/blacktulipconfidence/branches/GuiDemoMac/ в конце этой страницы.
Ответ 7
Пробовал все вышеперечисленное с qt 5.1.1, но всегда получал этот сбой:
QMessageLogger::fatal(char const*, ...) const + 161
QGuiApplicationPrivate::createPlatformIntegration() + 1763
QGuiApplicationPrivate::createEventDispatcher() + 28
QCoreApplication::init() + 101
QCoreApplication::QCoreApplication(QCoreApplicationPrivate&) + 42
поэтому я создал этот эликсир, YMMV:
1) получить вышеупомянутый, в основном, вид рабочего макрокоманды из github.
2) создайте этот новый macqtdeploy
3) добавьте это в main.cpp только для mac os x. этот материал "-platformpluginpath" в argv перед запуском qapplication.
int macStart(int argc, char *argv[]) {
QFileInfo fi(argv[0]);
QDir plugd(fi.dir());
plugd.cdUp();
plugd.cd("PlugIns");
QString plugins = plugd.absolutePath();
qDebug() << "PlugIns" << plugins;
char* argv_sub[argc + 2];
for (int i = 0; i < argc; ++i) {
char* temp = (char*) malloc(strlen(argv[i]) + 1);
strcpy(temp, argv[i]);
argv_sub[i] = temp;
}
char ppp[255];
strcpy(ppp, "-platformpluginpath");
argv_sub[argc] = ppp;
char pathx[2048];
strcpy(pathx, (char*) plugd.absolutePath().toLocal8Bit().constData());
argv_sub[argc + 1] = pathx;
DCApplication app(argc + 2, argv_sub);
app.startup();
return app.exec();
}
4) создать приложение
5) запустите новый macqtdeploy в приложении
6) доброта
Ответ 8
установить папку плагина в библиотекуPaths
QStringList paths;
paths.append("folder with plugins"); //can be inside bundle
QApplication::setLibraryPaths(paths);
Ответ 9
Я всегда встречался в этой дискуссии при поиске аналогичной ошибки с macdeployqt и QT Quick 2.0 с использованием QML.
Я обнаружил ошибку:
Machine:MacOS MyName$ ./tool
QQmlApplicationEngine failed to load component qrc:/main.qml:1 plugin cannot be
loaded for module "QtQuick": '/Users/thorstenbux/DAQRI/gitHub/artoolkit6/Source/Utilities/ImageDBSerialiser/build-ui/imageDatabase.app/Contents/PlugIns/quick/libqtquick2plugin.dylib'
is not a valid Mach-O binary (not a dynamic library)
и это:
ERROR: Could not parse otool output: "/Users/myname/DAQRI/gitHub/tool/Source/Utilities/tool/build-tool-Desktop_Qt_5_8_0_clang_64bit-Release/tool.app/Contents/PlugIns/quick/libqtquick2plugin.dylib:\n"
Я создал отдельный вопрос для такого рода ошибок здесь:
QT Quick (QML) собирает mac-.bundle → а не динамическая ошибка библиотеки при использовании macdeployqt
На всякий случай кто-то имеет такую же проблему и читает этот поток.