MacOS 上的 Qt .nib 问题

Posted

技术标签:

【中文标题】MacOS 上的 Qt .nib 问题【英文标题】:Qt .nib issues on MacOS 【发布时间】:2012-02-24 07:11:27 【问题描述】:

我正在尝试在另一台未安装 Qt 的 Mac 上部署 Qt C++ 应用程序。我收到“Qt 内部错误:无法加载 qt_menu.nib。.nib 文件应放在 QtGui.framework/Versions/Current/Resources/ 或应用程序包的资源目录中。”

我尝试将 qt_menu.lib 打包到两个建议的位置,但均未成功:

$ ls ./arya.app/Resources/
qt_menu.nib
$ ./arya.app/Contents/MacOS/arya 
Qt internal error: qt_menu.nib could not be loaded. The .nib file should be placed in QtGui.framework/Versions/Current/Resources/  or in the resources directory of your application bundle.

或:

$ mkdir QtGui.framework
$ mkdir QtGui.framework/Versions/
$ mkdir QtGui.framework/Versions/Current/
$ mkdir QtGui.framework/Versions/Current/Resources
$ mv ./arya.app/Resources/qt_menu.nib QtGui.framework/Versions/Current/Resources/
$ ./arya.app/Contents/MacOS/arya 
Qt internal error: qt_menu.nib could not be loaded. The .nib file should be placed in QtGui.framework/Versions/Current/Resources/  or in the resources directory of your application bundle.

我不确定是否可能存在某种联系,但在此之前我的 dylib 路径存在一些问题。在使用 install_name_tool 磕磕绊绊之后,我“解决”了它们:

export DYLD_LIBRARY_PATH=.

在运行应用程序之前。

构建应用程序

CONFIG -= app_bundle

没有区别。

【问题讨论】:

应用程序在 Windows 和 Linux 上运行良好,顺便说一句。 您是否尝试在构建应用后在应用上运行macdeployqt @Brendan:不,从未听说过。看起来很适合我的问题,等我假期回来再试试,谢谢!请发布此建议的完整答案,以便我可以投票并接受它(如果它有效)。 【参考方案1】:

在与另一个应用程序解决了同样的问题之后,我设法确定了可以轻松解决这个 .nib 问题的确切命令:

mkdir -p application.app/Contents/Frameworks/QtGui.framework/Resources
cp -r $(QTLIBDIR)/QtGui.framework/Versions/4/Resources/qt_menu.nib application.app/Contents/Frameworks/QtGui.framework/Resources

这并没有解决为 mac 部署的其他问题 - 只是 .nib 问题。

【讨论】:

【参考方案2】:

试试这个:

(1) 删除您的export DYLD_LIBRARY_PATH=.

(2) 删除您的CONFIG -= app_bundle

(3) 将QT框架放入./arya.app/Contents/Frameworks

即将QtGui.framework的所有内容放入./arya.app/Contents/Frameworks/QtGui.frameworkQtCore.framework 转成 ./arya.app/Contents/Frameworks/QtCore.framework

所以你的 qt_menu.nib 将自动成为 ./arya.app/Contents/Frameworks/QtGui.framework/Versions/Current/Resources/qt_menu.nib

【讨论】:

没有解决我的问题。首先,我再次遇到了 dylib 问题。将 dylib 复制到 .并再次执行导出 DYLD 技巧,我回到了开始的地方:$ ./arya.app/Contents/MacOS/arya Qt 内部错误:无法加载 qt_menu.nib。 (...) $ ls ./arya.app/Contents/Frameworks/ QtCore.framework QtGui.framework QtNetwork.framework QtOpenGL.framework QtSvg.framework QtXml.framework $ ls ./arya.app/Contents/Frameworks/QtGui.framework /Versions/Current/Resources/qt_menu.nib @Fabio: (1) arya.app 是您的捆绑包的名称。那是对的吗? (2) 你删除了export DYLD_LIBRARY_PATH=.,删除了CONFIG-=app_bundle,删除了qmakemake生成的所有文件,包括Makefile、对象、MOC生成的文件、UI生成的文件、你的arya.app包等。只留下源代码和 *.pro 项目文件。对? (3) 您编译了干净的项目并获得了包含arya.app/Contents/MacOS/arya 二进制文件的arya.app 捆绑包。对? (待续) @Fabio(继续):(4)您将必要的框架复制到 arya.app/Contents/Frameworks(区分大小写)并仔细检查它们的目录结构是否与源(在 /Library/Frameworks 中)匹配,包括所有符号链接(如果您愿意,可以删除的标头除外)。对?如果所有四个语句都正确,并且您确实已经完成了所有操作,但仍然无法正常工作,请发布otool -L arya.app/Contents/MacOS/arya 的输出和otool -L arya.app/Contents/Frameworks/QtCore.framework/QtCore 命令的输出。 是的,所有这些步骤都是自动化的,甚至是第 4 步,所以这一切都得到了妥善处理,而且都经过了双重和三重检查。应用程序上的otool -L 显示了库在开发机器上的硬编码绝对路径(应用程序在开发机器上运行良好,顺便说一句 - 这是我在部署时遇到问题的 QA 机器)。接下来的两周我正在休假,但我会尝试获得这些输出并在下周将它们发布在这里。感谢您的反馈。 @Fabio:“应用程序上的otool -L 显示了开发机器上库所在位置的硬编码绝对路径。”我懂了。然后,您还必须修复应用程序二进制文件和您部署的每个 Qt 二进制文件的路径。像这样:install_name_tool -change full_path_ref relative_path_ref target_binary_path - 将引用从绝对路径更改为相对于您的 arya.app/Contents/Frameworks 路径。例如。 install_name_tool -change /path/to/Qt/lib/QtGui.framework/Versions/4/QtGui QtGui.framework/Versions/4/QtGui arya.app/Contents/MacOS/arya(待续)【参考方案3】:

构建后尝试在您的.app 上运行macdeployqt。它将所需的 Qt 框架(以及任何其他所需的 dylibs)复制到包中并修复二进制文件的链接路径,以便它知道从自己的包中链接 Qt。

(它还有一个错误会导致路径不以lib/ 结尾的任何库(如/opt/local/lib/opencv/cv.lib 无法正确复制,但有一个针对此问题的单行源修复)

【讨论】:

以上是关于MacOS 上的 Qt .nib 问题的主要内容,如果未能解决你的问题,请参考以下文章

MacOS 上的 Qt/Cocoa - 移除进度条动画

Qt 交叉编译 Linux -> MacOS 无法链接到 Qt 库

PySide 安装错误 - python 2.7 - QT5 - macOS Sierra

Cocoa (Xcode 4),从另一个 NIB 更改一个 NIB 上的标签

在 Qt 中自定义 AppMenu

仅在 MacOS 中,QLineEdit 构造函数中 setupUi 上的应用程序崩溃