我在用我的Mac应用程序部署Qt框架时遇到了问题,我希望一些人能知道为什么我会在洁净Mac上运行这个应用程序,即不是开发人员Mac。
操作系统: 10.7 .2和使用XCode
错误消息:
Library not loaded: @loader_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
Referenced from:/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml很明显,有些地方出了问题,因为QtXml是从/../Frameworks/../Framework引用的,而这个框架并不存在。
这就是设置:我有一个使用QtCore和QtXml的dylib (不是我选择的,但现在我需要这两个框架),dylib在NSBundle中使用,它由主应用程序加载,包位于资源文件夹中。dylib由复制文件构建阶段移动到文件夹内容/框架,使用otool将install_name设置为(如http://doc.qt.digia.com/4.3/deployment-mac.html所述):
@loader_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
@loader_path/../Frameworks/QtXml.framework/Versions/4/QtXml然后将Qt框架移动到内容/框架中,并将Qt框架的install_name设置为:
@executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore和引用@executable_path/../Frameworks/QtXml.framework/Versions/4/QtXml:@executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore的QtXml QtXml
现在,当我在开发者mac上运行这个应用程序时,它显然可以工作,因为Qt已经安装好了,但是当移动到干净的mac上时,我得到了错误消息,在控制台应用程序中是可读的。我曾试图将executable_path更改为loader_path,但这没有起作用。我不知道我做错了什么,也不知道为什么我做错了,也没有在谷歌上找到任何东西,当然我可能找错地方了。有什么办法解决这个问题吗?
--这是整个错误消息:
MainApp: Error Domain=NSCocoaErrorDomain Code=3587“包”库无法加载,因为它被损坏或缺少必要的资源。
(dlopen_preflight(/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/目录/MacOS/ Library ):未加载库:
@loader_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore引用自: /Users/ someUser /someUser/ MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml原因:找不到图像) UserInfo=0x107c5d5d0 {NSLocalizedFailureReason=The包损坏或缺少必要的资源。,NSLocalizedRecoverySuggestion=Try重新安装包.,NSFilePath=/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/Library,NSDebugDescription=dlopen_preflight(/Users/someUser /Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/Library):库未加载:@loader_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
引用: /Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle/Contents/MacOS/../Frameworks/../Frameworks/QtXml.framework/Versions/4/QtXml原因:图像未找到,NSBundlePath=/Users/someUser/Downloads/MainApp.app/Contents/Resources/Lib/Library.bundle,NSLocalizedDescription=The包“库”无法加载,因为它已损坏或缺少必要的资源。}。
发布于 2012-03-05 09:37:06
更新
如前所述,将QT编译为静态库是方法之一。随着小牛(10.9)的发布,我们也需要协同设计框架(http://furbo.org/2013/10/17/code-signing-and-mavericks/),在QT4.8.5中也存在一些问题(https://bugreports.qt-project.org/browse/QTBUG-32896)。即使有建议的修复,我仍然有一些问题,当运行应用程序在清洁的机器。因此,我最终编译了Qt5.2到静态库,将它们链接到应用程序中,并对它们进行了codesign。
老
问题解决了,我在内容/框架中将Qt框架移动到应用程序包中,并使用otool设置了通向@executable_path/../Frameworks的路径,即将其从库包中移出。是的,解决方案很简单,但我仍然不知道为什么库可执行文件在使用@loader_path时找不到框架。
最好的解决方案可能是使用静态库,而不是每天在bundle...you中学习;)
发布于 2012-01-30 14:38:15
在开发mac上,一切都可以工作,因为安装了Qt库。不过,在你把应用程序送到的任何mac电脑上,情况可能不会是这样。Qt套件附带了一个名为macdeployqt的工具来修复这个问题。因此,在终端中,在编译应用程序之后,执行以下操作:
# cd my-cool-app-Desktop
# macdeployqt my-cool-app.app请注意,它还可以用于创建一个.dmg文件,用于将所有内容一起传送:
# cd my-cool-app-Desktop
# macdeployqt my-cool-app.app -dmg完成此操作后,可以将.app目录或.dmg文件交给没有安装Qt的其他人,以便按照正常情况使用和运行。
请注意,下次尝试在开发人员计算机上运行它时,它可能会抱怨安装了多个共享库。因此,一旦您在其他地方复制了它,为了分发它,就删除整个.app目录,让it创建者(或其他什么)重新构建它。
https://stackoverflow.com/questions/9061354
复制相似问题