我正在尝试在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
我告诉Cmake使用MacOSX10.5.sdk(在Cmake GUI中设置,而不是在CMakeList.txt中):
但它似乎没有改变任何东西......
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命令不够用吗?)
我使用以下代码编译我的项目:
我使用以下方法测试项目:
修改
我发现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返回一个错误,告诉我需要动态...)
答案 0 :(得分:4)
您使用的libstdc++
来自gcc 4.6。由于您使用的是C ++ 0x,它在OS X附带的gcc版本中不可用,因此内置libstdc++
不起作用也就不足为奇了。您需要在应用程序包中发布您正在使用的libstdc++.dylib
(您可以将其放入,例如your.app/Contents/Libraries)。使用install_name_tool
确保使用相对路径引用它(使用@rpath
或@executable_path
)。
答案 1 :(得分:1)
虽然选择的答案对许多人来说可能更实用,但这实际上是Apple工具链中的一个错误,它通过一个非常小的补丁来解决。将这个问题归咎于使用C ++ 0x,甚至将这个问题归咎于使用不同版本的gcc当然是不正确的:这个东西通常应该有效。鉴于有多少人似乎经历了这个问题,因为用户(通过谷歌搜索判断)希望这可以在Xcode 5.1的上游修复(虽然我已经从过去从Apple获得了自鸣得意的反应,简单的五分钟修复为了更好地支持向后兼容性,我不会屏住呼吸;无论如何我都要提供雷达,因为我认为这种事情非常重要)。修复方法是修改ostream标头以在运算符周围添加__TARGETING_4_0_DYLIB保护<<字符串的实现。我在我的网站http://test.saurik.com/apple/ostream1.diff上放了一个补丁。