Qt 5.1 и Mac: ошибка в том, что macdeployqt не работает должным образом - программирование
Подтвердить что ты не робот

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 и перестроить без изменений)

4b9b3361

Ответ 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

Ответ 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

На всякий случай кто-то имеет такую ​​же проблему и читает этот поток.