【问题标题】:Unable to run an application compiled on OS-X Snow Leopard (10.6.7) on another Mac using OS-X Leopard (10.5.8). libstdc++.6.dylib error returned无法在另一台使用 OS-X Leopard (10.5.8) 的 Mac 上运行在 OS-X Snow Leopard (10.6.7) 上编译的应用程序。 libstdc++.6.dylib 错误返回
【发布时间】:2011-06-15 23:55:47
【问题描述】:

我正在尝试在 Max OS-X 上使用 C++0x 和 Ogre 移植 C++ 项目,但在 OS-X 版本之间遇到了可移植性问题。

我成功地使用 GCC 4.6.0 在 Mac OS-X 10.6 (Snow Leopard) 上编译了我的项目(因为我需要 C++0x)。这很难(可能是因为我是一个新的 OSX 用户)但它最终编译它没有错误。

我在 Application.app 包中包含了所有必需的组件、框架、插件等,它在这个 Mac OS-X 10.6 上运行良好

但是,当我在安装了 Mac OS-X 10.5.8 的旧笔记本电脑上传输项目时,我无法运行该应用程序。

如果我双击 .app,它会尝试启动,最后图标从菜单栏中消失,仅此而已。但是,如果我直接运行 .app 中包含的可执行文件,则会返回以下错误:

MacBook-2:~ root# /var/root/Desktop/MyProject.app/Contents/MacOS/MyProject ; exit;
dyld: lazy symbol binding failed: Symbol not found: __ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
  Referenced from: /var/root/Desktop/MyProject.app/Contents/MacOS/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre
  Expected in: /usr/lib/libstdc++.6.dylib

dyld: Symbol not found: __ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
  Referenced from: /var/root/Desktop/MyProject.app/Contents/MacOS/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre
  Expected in: /usr/lib/libstdc++.6.dylib

Trace/BPT trap
logout

这是应用程序包树视图。

MyProject.app

  • 组件
    • ... (Ogre 组件)
  • 框架
    • Ogre.framework
  • MacOS
    • 我的项目 (可执行文件)
  • 插件
    • ... (Ogre 插件)
  • 资源
    • ... (Ogre .cfg + 我的资产)

我告诉 Cmake 使用 MacOSX10.5.sdk 使用(在 Cmake GUI 内设置,而不是在 CMakeList.txt 内设置):

  • CMAKE_OSX_DEPLOYEMENT_TARGET 10.5
  • CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk

但它似乎并没有改变任何东西......


libstdc++.dylib 文件链接到 Mac 上用于编译应用程序的 libstdc++.6.0.9.dylib,而它链接到 Mac 上用于测试可移植性的 libstdc++.6.0.4.dylib。

但正如我告诉它使用 MacOSX10.5.sdk 我虽然它会在编译时使用 libstdc++.6.0.4.dylib,所以它可以在安装了 10.5 的 Mac 上运行

确实,我们的目标是让它在第二台 Mac(以及所有使用 10.5+ 的 Mac)上运行,而不需要对其进行任何更改。只需下载并运行...

有人能告诉我我在这里缺少什么吗?(我对 OS-X 的方法和组织不太熟悉,所以我可能会错过一些非常基本的东西,不要怕粗暴^^)。

如何在 Cmake 中指定目标 SDK?(使用的 Cmake 命令不够用吗?)


我使用以下代码来编译我的项目:

  • Mac OS-X 10.6.7
  • GCC 4.6.0
  • Cmake 2.8-4
  • 食人魔 1.7.3

我使用以下来测试项目:

  • Mac OS-X 10.5.8(安装了一些开发工具。我想我必须告诉它,以防它干扰应用程序)。

编辑:

我在这里发现 otool 是返回的日志

Valkeas-Mac:MacOS root# otool -L MyProject 
MyProject:
    @executable_path/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre (compatibility version 0.0.0, current version 1.7.3)
    @executable_path/../Components/libOgreTerrain.dylib (compatibility version 0.0.0, current version 1.7.3)
    /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 136.0.0)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
    /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
    /opt/local/lib/gcc46/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.15.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /opt/local/lib/gcc46/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.19.0)
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 949.54.0)
    /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 34.0.0)
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 677.26.0)
Valkeas-Mac:MacOS root# 

显然它链接到 gcc46 libstdc++.6.dylib(可能是正常的,因为我猜这个文件包含 GCC 4.6.0 的 C++0x 函数)。

那么有什么解决办法吗? (-static 返回一个错误,告诉我需要动态...)

【问题讨论】:

  • GCC 4.6.0?这不是 Apple 提供的编译器。尝试使用 gcc-4.0.1 或 gcc-4.2.1,它们是 Xcode 中仅有的 2 个 GCC 版本。
  • 我需要C++0X,Xcode支持的编译器不支持C++0x。这就是我不使用 Xcode 编译的原因,也是我使用大于 4.4 的 gcc 版本的原因
  • 那么不幸的是,在 llvm/Clang 支持 C++0x 之前,您可能不走运。

标签: c++ macos gcc cmake libstdc++


【解决方案1】:

您使用的 libstdc++ 来自 gcc 4.6。由于您使用的是 C++0x,它在 OS X 附带的 gcc 版本中不可用,因此内置的 libstdc++ 不起作用也就不足为奇了。您需要在应用程序包中发送您正在使用的libstdc++.dylib(您可以将其放入,例如,your.app/Contents/Libraries)。使用install_name_tool 确保它是使用相对路径引用的(使用@rpath@executable_path)。

【讨论】:

  • 从我使用 otool -L 可以看到的情况来看,它似乎有效。不幸的是,我使测试 MacBook 崩溃(无限引导循环),我将不得不保存数据并重新安装它,以查看它在转移到 10.5 OsX 时是否真的有效。一旦我能真正验证它是否有效,我会回到这里。
  • 这并没有解决问题,但这有助于进一步理解它,所以我接受了答案。谢谢。
  • @Valkea 什么解决了这个问题?我也有同样的。
  • @MattPhillips 嗨,那是很久以前的事了。现在我不记得确切...但是当我花了大约一个月来解决这个问题时,我做了一堆笔记。事实上,我保留了这些笔记。所以我会在圣诞节前去看看。
  • 我检查了我的笔记并在我的 osx 项目中使用了otool -L:似乎我在 exe 文件和 ogre 插件上使用了install_name_tool -change /opt/local/lib/gcc46/libstdc++.6.dylib @executable_path/libs/libstdc++.6.dylib FILENAME(但我不确定它是否对插件是强制性的...) 并将 gcc46 libstdc++.6.dylib 文件放在可执行文件旁边的 libs 文件夹中。
【解决方案2】:

虽然选择的答案对许多人来说可能更实用,但这实际上是 Apple 工具链中的一个错误,只需一个非常小的补丁即可轻松修复。将问题归咎于使用 C++0x 甚至将问题归咎于使用不同版本的 gcc 肯定是不正确的:这些东西通常应该可以工作。鉴于有多少人似乎作为用户体验过这个问题(通过谷歌搜索判断),希望这可以在 Xcode 5.1 的上游修复(尽管考虑到我过去从苹果公司得到的关于简单的五分钟修复的自鸣得意的反应为了更好地支持向后兼容性,我没有屏住呼吸;无论如何我都会提交雷达,因为我认为这种事情非常重要)。修复方法是修改 ostream 标头以在字符串的 operatorhttp://test.saurik.com/apple/ostream1.diff 上放了一个补丁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2012-02-04
    • 2011-11-24
    • 2010-12-12
    相关资源
    最近更新 更多