【问题标题】:x86 Qt app crashes on Mac OS 10.7 (Lion)x86 Qt 应用程序在 Mac OS 10.7 (Lion) 上崩溃
【发布时间】:2013-03-17 13:54:47
【问题描述】:

构建一个针对 Lion 和 Mountain Lion 的 Qt 应用程序。构建服务器位于 Mountain Lion 上。我有一个 32 位依赖项,所以我使用 -arch x86 从源代码编译了 Qt 4.8.4。该应用在 Mountain Lion 上运行良好,但在 Lion 上启动时崩溃。

这是堆栈跟踪的顶部:

1   QtGui    0x00c6a3e3 QMacPasteboardMime::~QMacPasteboardMime() + 2443
2   QtGui    0x00b904e4 QApplicationPrivate::initializeWidgetPaletteHash() + 6394
3   QtGui    0x00b91420 QApplicationPrivate::initializeWidgetPaletteHash() + 10294
4   QtGui    0x00c051d0 QApplicationPrivate::construct() + 222
5   QtGui    0x00c06052 QApplication::QApplication(int&, char**, int) + 100

删除 32 位依赖项并使用预构建 Qt 4.8.4 发行版进行构建修复了该问题。有人看到这个 Qt 构建配置有问题吗?

./configure \
    -debug-and-release \
    -developer-build \
    -opensource \
    -platform macx-g++ \
    -nomake examples \
    -nomake demos \
    -arch x86

我还尝试了 macx-llvm 制作规范,结果相同。任何反馈表示赞赏。谢谢!

【问题讨论】:

    标签: qt crash x86 osx-lion


    【解决方案1】:

    为什么不使用自制软件或官方二进制文件?两者都适合我。

    【讨论】:

    • 感谢您的建议。我正在尝试让自制软件以 32 位模式构建 Qt。 Qt 公式打开MacOS.prefer_64_bit?,它只调用/usr/sbin/sysctl -n hw.cpu64bit_capable。我破解了prefer_64_bit? 方法以仅返回false,这似乎可以工作,因为./configure 行确实包含-arch x86。但是,生成的框架文件仍然是x86_64。如果你已经能够让自制软件在 32 位模式下构建 Qt,你是怎么做到的?
    • 这应该是一条评论。
    【解决方案2】:

    在构建与 Lion 兼容的 32 位 QT 应用程序时,我遇到了相同的行为。我设法通过将 Qt 配置为使用 10.7 的旧 SDK 来解决这个问题,基本上使构建与 Lion 向后兼容。

    首先,我通过 Apple Developer Center 从旧 Xcode 版本中获得了 MacOSX10.7.sdk 作为一部分。最新的 Lion 嵌入在 Xcode 4.3.3 (xcode_4.3.3_for_lion.dmg) 的 DMG 中,只需安装 DMG 并将它们从 /Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs 复制到您当前的 Xcode 或更通用的 /Developer/SDKs/MacOSX10.7.sdk

    然后,我使用额外的 sdk 参数配置 QT(在我的例子中为 4.8.6)以匹配 SDK 的目标位置。

    -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk

    【讨论】:

      【解决方案3】:

      在为 win32 平台构建 Qt 库 4.8.6 时,我遇到了类似的问题。经过长时间的调查,我确定了Qt bug 27219的解决方案,“这个崩溃可以通过设置来解决: 导出 DYLD_FORCE_FLAT_NAMESPACE=1"。见:"https://bugreports.qt-project.org/browse/QTBUG-27219?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel"

      具体实现见:“http://0xced.blogspot.ro/2006/07/dealing-with-outdated-open-source-libs.html” 您必须通过设置 DYLD_FORCE_FLAT_NAMESPACE 环境变量来更新 Info.plist 文件以强制使用平面命名空间。这是通过在 Info.plist 文件中添加以下键来实现的:

      <key>LSEnvironment</key>
      <dict>
      <key>DYLD_FORCE_FLAT_NAMESPACE</key>
      <string>YES</string>
      </dict>
      

      【讨论】:

      • 当从 OSX 10.8 为 OSX 10.7 目标构建时,我自己建议添加上面的“-sdk”选项就足够了。当使用更新的 xcode 6 工具链为相同的 OSX 10.7 目标从 OSX 10.10 重建时,它再次失败,我重新发现了这篇文章。结合您的回答,问题就解决了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2012-10-31
      • 1970-01-01
      相关资源
      最近更新 更多