我正在尝试在 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
这是应用程序包树视图。
我的项目.app
- 成分
- ... (食人魔组件)
- 构架
- Ogre.framework
- 苹果系统
- 我的项目 (可执行文件)
- 插件
- ... (食人魔插件)
- 资源
- ... (食人魔 .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 返回一个错误,告诉我需要动态...)