在 10.6 上测试 Mac OS X 10.7 特定代码时出现“未找到符号”崩溃
Posted
技术标签:
【中文标题】在 10.6 上测试 Mac OS X 10.7 特定代码时出现“未找到符号”崩溃【英文标题】:"Symbol not found" Crash while Testing Mac OS X 10.7-specific code on 10.6 【发布时间】:2011-09-01 13:50:48 【问题描述】:我有一个应用程序使用了仅在 10.7 Lion 中发现的几个类。 (例如,NSFileCoordinator。)
当我的应用程序启动时,它可以使用 NSFileCoordinator 来协调对数据存储的读取访问。 (我保存为 XML。)
应用程序在 10.7 Lion 下启动正常,但在 10.6 Snow Leopard 下启动时,应用程序崩溃并显示如下错误。
我的基础 SDK 设置为 10.7,部署目标为 10.6。据我所知,我的所有代码都已正确包装,例如:
if (NSClassFromString(@"NSFileCoordinator") != nil)
// Do something the 10.7 way
else
// Do something the 10.6 way
但由于某种原因,我仍然看到崩溃。由于Base SDK是10.7,所以我无法在10.6的Xcode下运行应用程序,调试困难。正在向控制台记录其他消息:
9/1/11 9:48:03 AM [0x0-0x18018].com.me.myapp[173] dyld: Symbol not found: _OBJC_CLASS_$_NSFileCoordinator
9/1/11 9:48:03 AM [0x0-0x18018].com.me.myapp[173] Referenced from: /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
9/1/11 9:48:03 AM [0x0-0x18018].com.me.myapp[173] Expected in: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
9/1/11 9:48:03 AM [0x0-0x18018].com.me.myapp[173] in /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
还有崩溃报告:
Process: myapp [137]
Path: /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
Identifier: com.me.myapp
Version: 1.5.0 (150)
Code Type: X86-64 (Native)
Parent Process: launchd [92]
Date/Time: 2011-09-01 09:40:32.591 -0400
OS Version: Mac OS X 10.6.8 (10K549)
Report Version: 6
Interval Since Last Report: 2009 sec
Crashes Since Last Report: 5
Per-App Crashes Since Last Report: 5
Anonymous UUID: 32784C79-0821-471E-BCBF-BE5874774075
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread: 0
Dyld Error Message:
Symbol not found: _OBJC_CLASS_$_NSFileCoordinator
Referenced from: /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
Expected in: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
in /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
【问题讨论】:
【参考方案1】:@Anomie 有正确的答案,但让我进一步扩展。 这是一个命令行工具的代码,与您正在做的类似:
int main (int argc, const char * argv[])
@autoreleasepool
if (NSClassFromString(@"NSFileCoordinator"))
NSLog(@"Version >= 10.7");
else
NSLog(@"Version < 10.7");
return 0;
此程序链接到的唯一框架是 Foundation。但是为了弱链接到这个框架,您必须执行以下操作:
-
在项目浏览器中点击项目
转到“构建阶段”
转到“将二进制文件与库链接”并删除“Foundation.framework”
转到“构建设置”并添加以下“其他链接器标志”:
-weak_framework 基础
重建您的项目。我已经在 OS X 10.6 和 10.7 上进行了测试,都没有崩溃并且都产生了预期的输出。希望这会有所帮助。
【讨论】:
非常感谢,非常简洁和有用的答案。也感谢您的测试,当之无愧的分数。 :)【参考方案2】:你需要weakly link框架,所以这些未解析的符号在加载时不会出错。
【讨论】:
虽然您先到这里,但为了他的示例和个人测试,抛掷指向@aLevelOfIndirection。 :) 谢谢!以上是关于在 10.6 上测试 Mac OS X 10.7 特定代码时出现“未找到符号”崩溃的主要内容,如果未能解决你的问题,请参考以下文章
界面生成器:10.7 之前的 Mac OS X 版本上的属性不可用标识符