Qt 5.1和Mac:使macdeployqt无法正常工作的错误

Chr*_*phe 15 macos qt macdeployqt

我有一个问题,因为该版本5.1rc2QtMac 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)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Qt库的路径中存在双斜杠.当我使用macdeployqt部署我的应用程序时,这些路径不会更改为本地框架(@executable_path /../ Frameworks/...),因为这...我必须使用install_name_tool手动执行,并且它是真烦人

我该怎么做才能解决这个问题?(我已经尝试重新安装Qt,清理,再次运行qmake并重建而无需更改)

mik*_*131 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>
Run Code Online (Sandbox Code Playgroud)

在此解决方法之后,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.
Run Code Online (Sandbox Code Playgroud)

所以我的所有资源都变得不可用了.有谁知道如何解决这个问题?

我也开始讨论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

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

希望能帮助到你


Dan*_*man 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
  }
Run Code Online (Sandbox Code Playgroud)

这有效地称为: 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
Run Code Online (Sandbox Code Playgroud)

最后,我的目录结构如下所示:

  Project
    - qml
      - appname
        files1.qml
        files2.qml
        ...
        filesX.qml 
    - js
    - images
Run Code Online (Sandbox Code Playgroud)

然后将它们打包到资源文件中,根据定义,它不会被复制到构建目录,因此macdeployqt无法扫描它们,除非路径是完美的.通过使用这个构建过程,我在构建(发布)中有一个步骤来处理它,我不需要macdeployqt在我调试时运行.请记住,如果你使用app_bundle,你需要在每个构建上运行macdeployqt,这将真正搞乱你的调试工作流程.