首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt 5.1和Mac:使macdeployqt无法正常工作的错误

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

Stack Overflow用户
提问于 2013-07-05 01:41:06
回答 9查看 7.1K关注 0票数 16

我在Mac的Qt版本5.1rc2上遇到了问题。(5.1也受影响,5.1rc1不受影响)

当我构建我的应用程序并在二进制文件上执行otool -L以查看共享库的路径时,我得到:(这只是一个示例,为了清楚起见,我删除了其中的一些)

代码语言:javascript
复制
/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,不做任何更改就重新构建)

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-07-11 19:10:43

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

在我构建我的程序之后,我已经将exe中的链接更改为正确的链接

代码语言:javascript
复制
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中的所有链接更改为相对链接。

但是我的App坏了。问题是,我已经将我所有的图像和QML文件添加到了资源中。在我运行macdeployqt之后-我无法运行我的应用程序。当我用gdb运行这段代码时--我看到了下一个错误:

代码语言:javascript
复制
QQmlApplicationEngine failed to load component 
qrc:/qml/main.qml:-1 File not found

Error: Your root item has to be a Window.

因此,不知何故,我所有的资源都变得不可用。有谁知道怎么解决这个问题吗?

我还在qt forum上发起了一个讨论

更新,如何部署:

  1. 使用this script去掉动态链接路径中的双斜杠。

./fixqt.sh从该repository.

  • Run macdeployqt中指定目录工具,并使用您的qml源代码指定~/Qt5.1.0/5.1.0/clang_64

  • Build:

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

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

希望能有所帮助

票数 10
EN

Stack Overflow用户

发布于 2015-01-30 01:57:50

我将这篇文章作为一个解决方案发布,因为我刚刚在5.3版本中浪费了(另一天)时间(我假设5.4版本也是一样的)。

macdeployqt现在可以正常工作了,但这里失败的文档是,您需要指定和每个qml目录的绝对路径(相对可能可以工作,但我一点运气都没有)。

下面是我在发布过程中解决这个问题的方法:

在项目文件中,我现在有

代码语言:javascript
复制
  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是源目录,可执行文件从build目录运行。构建的绝对路径是OUT_PWD

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

The Short Answer

macdeployqt必须扫描您的qml文件,如果您正在使用它们,否则导入将被破坏,您将看到如下错误:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
  Project
    - qml
      - appname
        files1.qml
        files2.qml
        ...
        filesX.qml 
    - js
    - images

然后,这些文件被打包到Resource文件中,根据定义,该文件不会复制到build目录,因此macdeployqt无法扫描它们,除非路径是完美的。通过使用此构建过程,我在构建(发行版)中有了一个处理它的步骤,并且我在调试时不必运行macdeployqt。请记住,如果您使用app_bundle,则需要在每个构建上运行macdeployqt,这将真正扰乱您的调试工作流程。

票数 6
EN

Stack Overflow用户

发布于 2013-07-11 22:44:37

此线程:

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

包含此链接:

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

lasconic写的这个脚本(不是我的作品):

代码语言:javascript
复制
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=/Users/MyName/Qt5.1.0/5.1.0/clang_64QTDIR=$1

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

并使用以下命令运行

代码语言:javascript
复制
sh thankslasconic.sh

然后你就可以运行

代码语言:javascript
复制
macdeployqt myapp.app

它应该是有效的。对我来说是这样的。这就是我把它贴在这里的原因。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17475788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档