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.framework, QtCore.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
,删除了qmake
和make
生成的所有文件,包括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 问题的主要内容,如果未能解决你的问题,请参考以下文章
Qt 交叉编译 Linux -> MacOS 无法链接到 Qt 库
PySide 安装错误 - python 2.7 - QT5 - macOS Sierra