无法在另一台使用OS-X Leopard(10.5.8)的Mac上运行在OS-X Snow Leopad(10.6.7)



我正试图在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.框架
  • MacOS
    • MyProject(可执行文件)
  • 插件
    • (Ogre插件)
  • 资源
    • (Ogre.cfg+我的资产)

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

  • CMAKE_OSX_deployment_TARGET 10.5
  • CMAKE_OSX_SYSROOT/开发人员/SDKs/MacOSX10.5.sdk

但这似乎并没有改变任何事情。。。


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

但当我告诉它使用MacOSX10.5.sdk时,我认为它在编译时会使用libstdc++.60.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
  • Ogre 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返回一个错误,告诉我需要动态…)

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

虽然选择的答案对许多人来说可能更实用,但这实际上是苹果工具链中的一个错误,只需一个很小的补丁就可以轻松修复。把这个问题归咎于使用C++0x,甚至把这个问题归因于使用不同版本的gcc,这当然是不正确的:这些东西通常应该是有效的。考虑到有多少人作为用户(通过谷歌搜索判断)似乎经历了这个问题,希望这可以在Xcode 5.1中得到解决(尽管考虑到我过去从苹果那里得到的沾沾自喜的反应,即为了更好地支持向后兼容性而进行的简单的五分钟修复,我并没有屏住呼吸;无论如何,我都会提交一份雷达文件,因为我认为这类事情真的很重要)。修复方法是修改ostream标头,在操作员周围添加__TARGETING_4_0_DYLIB防护<lt;字符串的实现。我在我的网站上贴了一个补丁http://test.saurik.com/apple/ostream1.diff.

最新更新