16

我有一个问题5.1rc2,因为QtMac 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 并在没有更改的情况下重建)

4

9 回答 9

10

有同样的问题。我应用了下一个解决方法:

构建程序后,我已将 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论坛上开始讨论

更新,如何部署:

  1. 使用此脚本可以消除动态链接路径中的双斜杠。

    ./fixqt.sh ~/Qt5.1.0/5.1.0/clang_64

  2. 从此存储库构建 macdeployqt 工具。

  3. 运行 macdeployqt 并使用您的 qml 源指定 dir:

    macdeployqt MyApp.app/ -qmldir=../src/qml -dmg

在这些步骤之后,我设法在没有安装 QT 的情况下在不同的 OS X 系统上运行我的应用程序。我已将所有 qml 文件和图像添加到资源中。在 MyApp.app/Content/MacOS/ 中复制的 QtQuick 和 QtQuick.2 模块

希望能帮助到你

于 2013-07-11T11:10:43.190 回答
6

我将其发布为解决方案,因为我刚刚在 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.

将其保留在项目的发布配置中的好处在于我正常调试(没有应用程序包)并且发布包正确地从创建者构建。从理论上讲,我可以将其包装到 Jenkins 构建中,并一劳永逸地解决这个令人头疼的问题。

简短的回答

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,这将真正扰乱您的调试工作流程。

于 2015-01-29T17:57:50.467 回答
4

这个线程:

http://www.qtcentre.org/threads/55277-Qt-5-1-and-Mac-Bug-making-macdeployqt-not-working-properly

包含此链接:

https://gist.github.com/lasconic/5965542

对此脚本由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=$1QTDIR=/Users/MyName/Qt5.1.0/5.1.0/clang_64

将文件保存在与 myapp.app 相同的目录中

并运行它

sh thankslasconic.sh

然后你可以运行

macdeployqt myapp.app

它应该可以工作。对我来说确实如此。这就是我在这里发布它的原因。

于 2013-07-11T14:44:37.273 回答
1

我认为它是一个安装程序错误。引用.../Qt5.1.0//5.1.0/...的所有库和工具(由安装程序编译/链接?)(带有双斜杠)

我已经尝试过 Mac 的在线和离线安装程序,结果相同。

我已将其报告为错误。 https://bugreports.qt-project.org/browse/QTBUG-32467

于 2013-07-07T12:02:56.147 回答
1

作为后续,此错误似乎已在 Qt5.1.1 中修复 https://bugreports.qt.io/browse/QTBUG-32365

于 2013-11-04T19:06:15.527 回答
0

使用 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获取上述大部分工作的 macqtdeploy 。

2) 构建这个新的 macqtdeploy

3) 将此添加到 main.cpp 仅适用于 mac os x。在启动 qapplication 之前,这会将“-platformpluginpath”填充到 argv 中。

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) 善良

于 2013-09-28T18:47:08.193 回答
0

将插件文件夹设置为 libraryPaths

QStringList paths;
paths.append("folder with plugins"); //can be inside bundle
QApplication::setLibraryPaths(paths);
于 2014-04-27T17:06:03.713 回答
0

在使用 QML 寻找 macdeployqt 和 QT Quick 2.0 的类似错误时,我总是以这个讨论结束。

我发现的错误是这样的:

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) assemble mac-.bundle -> not a dynamic library error when using macdeployqt

以防万一有人遇到同样的问题并阅读此线程。

于 2017-03-01T03:51:58.107 回答