无法在另一台使用OS-X Leopard(10.5.8)的Mac上运行在OS-X Snow Leopard(10.6.7)上编译的应用程序。libstdc&x2B+;。6.1返回了动态库错误 我试图用C++ 0x和OGRE在Max OSX上移植C++项目,我遇到OSX版本之间的可移植性问题。

无法在另一台使用OS-X Leopard(10.5.8)的Mac上运行在OS-X Snow Leopard(10.6.7)上编译的应用程序。libstdc&x2B+;。6.1返回了动态库错误 我试图用C++ 0x和OGRE在Max OSX上移植C++项目,我遇到OSX版本之间的可移植性问题。,c++,macos,gcc,cmake,libstdc++,C++,Macos,Gcc,Cmake,Libstdc++,我成功地使用GCC4.6.0在MacOS-X10.6(SnowLeopard)上编译了我的项目(因为我需要C++0x)。这很难(可能是因为我是一个新的OSX用户),但它最终编译了它,没有出错 我在Application.app包中包含了所需的所有组件、框架、插件等,在这个Mac OS-X 10.6上它确实可以很好地启动 但是,当我在安装了MacOS-X10.5.8的旧笔记本电脑上转移项目时,我无法运行该应用程序 如果我双击.app,它会尝试启动,最后图标会从菜单栏消失,仅此而已。但如果我直接运行

我成功地使用GCC4.6.0在MacOS-X10.6(SnowLeopard)上编译了我的项目(因为我需要C++0x)。这很难(可能是因为我是一个新的OSX用户),但它最终编译了它,没有出错

我在Application.app包中包含了所需的所有组件、框架、插件等,在这个Mac OS-X 10.6上它确实可以很好地启动

但是,当我在安装了MacOS-X10.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

  • 组成部分
    • 。。。(食人魔组件)
  • 框架
    • 食人魔框架
  • 马科斯
    • MyProject(可执行)
  • 插件
    • 。。。(食人魔插件)
  • 资源
    • 。。。(Ogre.cfg+我的资产)

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

  • CMAKE_OSX_部署_目标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上运行(所有Mac都使用10.5+),而不改变任何内容。只需下载并运行

有人能告诉我我在这里遗漏了什么吗?(我对OS-X的方法和组织结构感觉不太流利,所以我可能遗漏了一些非常基本的东西,不要害怕粗鲁^^)

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


我使用以下方法编译我的项目:

  • Mac OS-X 10.6.7
  • GCC 4.6.0
  • Cmake 2.8-4
  • 食人魔1.7.3
我使用以下内容来测试项目:

  • MacOS-X10.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(可能是正常的,因为我猜这个文件包含GCC4.6.0的C++0x函数)


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

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

虽然所选择的答案可能对许多人来说更实用,但实际上这是苹果工具链中的一个bug,只需一个很小的补丁即可修复。将问题归咎于使用C++0x,甚至将问题归咎于使用不同版本的gcc,这当然是不正确的:一般认为这些东西是可以工作的。考虑到有多少人作为用户体验到了这个问题(通过谷歌搜索判断),希望Xcode 5.1能够在上游解决这个问题(尽管过去我从苹果那里得到了自鸣得意的反应,关于简单的五分钟修正以更好地支持向后兼容性,但我并没有屏住呼吸,我要把雷达归档不管,因为我认为这种事情非常重要。)。修复方法是修改ostream头,在operatorGCC 4.6.0周围添加uu-TARGETING u 4 u 0 u动态库保护?这不是Apple提供的编译器。请使用gcc-4.0.1或gcc-4.2.1进行尝试,它们是Xcode中包含的唯一两个gcc版本。我需要C++0X,Xcode支持的编译器不支持C++0X。这就是为什么我不使用Xcode进行编译的原因这也是我使用大于4.4的gcc版本的原因。不幸的是,在llvm/Clang支持C++0x之前,您可能运气不佳。从我所看到的otool-L来看,它似乎可以工作。不幸的是,我破坏了测试MacBook(无限引导循环)我必须保存数据并重新安装它,以查看它在传输到10.5 OsX时是否真的有效。我会尽快回到这里,以验证它是否有效。这并没有解决问题,但有助于进一步理解它,所以我接受答案。谢谢。@Valkea是什么解决了问题?我也有同样的问题。@MattPhillips嗨,那是很久以前的事了。现在我记不太清楚了……但当我花了大约一个月的时间来解决这个问题时,我做了一大堆笔记。事实上,我保存了这些笔记。所以我会在圣诞节前试着看一下。我检查了我的笔记,并在我的osx项目上使用了
otool-L
:看起来我使用了
install_name_tool-在exe文件和ogre插件上更改/opt/local/lib/gcc46/libstdc++.6.dylib@executable_path/libs/libstdc++.6.dylib FILENAME
(但我不确定这对插件是强制性的…),并将gcc46 libstdc++.6.dylib文件放在libs文件夹中