Qt 5无法在SnowLeopard上部署。

6

我有一个问题,我的应用程序在10.6 Snow Leopard上无法运行。

我使用以下参数进行编译:

qmake LSPRO.pro -r -spec macx-clang CONFIG+=release CONFIG+=x86_64

在我的项目文件中,我有以下这些元素:

TEMPLATE = app
HEADERS = \
    mainwindow.h \
    app_mediamanager.h \
    api.h \
    tool_htmleditor.h \
    tool_videoencoder.h \
    tool_thumbnaileditor.h
SOURCES = \
    main.cpp \
    mainwindow.cpp \
    app_mediamanager.cpp \
    api.cpp \
    tool_htmleditor.cpp \
    tool_videoencoder.cpp \
    tool_thumbnaileditor.cpp

QT += network webkitwidgets widgets concurrent sql

QMAKE_CXXFLAGS_X86_64 += -mmacosx-version-min=10.6
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6

ICON = icon.icns

RESOURCES = lspro.qrc

即使只是一个简单的Hello world程序或示例文件,也无法正常运行...

我使用macdeployqt脚本添加库。 在10.6上运行时,报告中会出现以下错误:

Dyld Error Message:
  Library not loaded: /usr/lib/libc++.1.dylib
  Referenced from: /Users/username/Desktop/LSPRO.app/Contents/MacOS/../Frameworks/QtWebKitWidgets.framework/Versions/5/QtWebKitWidgets
  Reason: image not found

问题很简单:我如何从10.8的干净Qt5中针对10.6?
更新1:
感谢评论,看起来10.6尚未支持c++11,导致应用程序在查找时崩溃。我尝试了两个解决方案:
失败的解决方案1:我使用noc++11标志重新构建了Qt5,生成的应用程序在snowleopard上启动,但无法调用外部二进制/执行命令(应用程序崩溃并显示EXC_BAD_ACCESS),尽管直接调用该二进制文件时运行正常,还有可能更多未发现的问题。
失败的解决方案2:我尝试天真地在snowleopard中包含缺失的dylibs(libc++.1.dylib和libc++abi.dylib),但应用程序仍会崩溃并显示以下消息:
Dyld Error Message:
  Symbol not found: _NSPreferredScrollerStyleDidChangeNotification
  Referenced from: /Volumes/SANS TITRE/tests/LSPRO1.app/Contents/MacOS/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets
  Expected in: /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit

otool -L of a 5.1.0 rc1 build

@executable_path/../Frameworks/QtWebKitWidgets.framework/Versions/5/QtWebKitWidgets (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtQuick.framework/Versions/5/QtQuick (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtQml.framework/Versions/5/QtQml (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtOpenGL.framework/Versions/5/QtOpenGL (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtPrintSupport.framework/Versions/5/QtPrintSupport (compatibility version 5.1.0, current version 5.1.0)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)
    @executable_path/../Frameworks/QtWebKit.framework/Versions/5/QtWebKit (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtSql.framework/Versions/5/QtSql (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtSensors.framework/Versions/5/QtSensors (compatibility version 5.1.0, current version 5.1.0)
    @executable_path/../Frameworks/QtConcurrent.framework/Versions/5/QtConcurrent (compatibility version 5.1.0, current version 5.1.0)
    /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

解决方案:

好的,最终成功了。 从git上编译了Qt5(5.1.2)在Snow Leopard上(使用带有10.6 SDK的Xcode 4.2)。 在我的情况下,只需使用以下配置即可:

./configure -developer-build -opensource -nomake examples -nomake tests -qt-sql-mysql

我不得不修复代码中的一些小问题,例如变量名等,以免应用程序无故崩溃,之后一切都正常了。

只是不要忘记在10.6上使用mac deploy工具,这样应用程序就可以在10.8上运行正常(未经10.7测试,但我认为也没问题)。

希望这能帮助到任何人。


如果您查看应用程序包,QtWebKitWidgets框架是否实际存在于dyld错误显示的给定路径中? - TheDarkKnight
是的,它存在。它是调用libc++.1的那个。 - Vincent Duprez
请访问以下网址:https://dev59.com/V2Yq5IYBdhLWcg3wbgDk。苹果公司决定仅在10.7及更高版本上支持libc++。 - Kurt Pattyn
有没有办法在Snow Leopard上部署,通过在10.8上编译应用程序? - Christophe
我个人还没有成功,现在只是在处理10.6。对于我在这个紧急项目中有效。 - Vincent Duprez
显示剩余3条评论
3个回答

2
“NSPreferredScrollerStyleDidChangeNotification”通知仅在OSX 10.7及更高版本中可用,如本页面底部所述:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSScroller_Class/Reference/Reference.html

如果MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7,则Qt将有条件地编译OS X 10.7 API。例如见:

http://qt.gitorious.org/qt/qtbase/blobs/b9826799405293ee5969015eed37957daad198ee/src/widgets/styles/qmacstyle_mac.mm

可能你正在使用的Qt版本没有使用10.6 SDK进行编译。
已知问题是:“要在10.6上或为10.6构建Qt,您需要在10.6机器上自行构建Qt”。

http://qt-project.org/wiki/Qt500KnownIssues


好的,我将在Snow Leopard上构建Qt5,并在半小时内返回结果。我可以在10.8上使用已构建的QT5来开发应用程序吗?还是需要保持在10.6上? - Vincent Duprez
@VincentDuprez 抱歉,我不知道那个问题的答案。 - Ross Bencina

1
如果您正在使用Qt 5.1,那么这是macdeployqt已知的问题,它不会在可执行文件上更正链接库路径,您可以通过以下方式自行查看。
otool -L <executable>

你可以切换回Qt 5.1.0-rc1,或者在此线程中有一个脚本解决方案,可以为您修复问题。

很抱歉告诉你,我在使用预编译库时,5.1.0 RC1也得到了完全相同的结果。 - Vincent Duprez
请问您能否在macdeployqt后发布otool -L <executable>的输出? - stepanbujnak
很抱歉,由于文本长度过长,无法在评论中发布。请提供其他方式进行文本传输。 - Vincent Duprez

0

在Mac OS 10.6上使用Qt 5运行应用程序的唯一方法是使用-no-c++参数配置Qt。对我来说,在10.6上编译Qt不是一个选择,因为它没有Retina支持。

正确的解决方法是:

Mac OS 10.7 + Qt 5.2.0 + xcode 4.6 + 使用-no-c++11参数进行配置

附:使用Vmware和10.7编译Qt。在任何Mac OS X(10.9.1)上开发和部署您的应用程序。


我在10.6上编译了Qt,并在10.9上使用,但应用程序总是崩溃,例如处理“打开文件”对话框等。在Maverick中耦合Qt时没有问题。 - Vincent Duprez
嗯,那个崩溃可能是任何原因造成的。Qt5可以在10.6上编译,并且应用程序可以正常部署。 - GeekUser
这是我们的设置:OS X 10.8.5 + Qt 5.2.1 + Xcode 5.0 + ./configure -no-c++11 -arch i386 -platform macx-clang-32 -sdk macosx10.6 -> 在这里运行良好。 - Sebastian Wagner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接