在 OCUnit 中使用核心数据类的 Apple Mach-O 链接器错误
Posted
技术标签:
【中文标题】在 OCUnit 中使用核心数据类的 Apple Mach-O 链接器错误【英文标题】:Apple Mach-O Linker Error using Core Data classes in OCUnit 【发布时间】:2012-07-03 14:19:05 【问题描述】:好的,这是我的测试类中的代码:
- (NSManagedObjectContext*)managedObjectContextWithConcurrencyType:(NSManagedObjectContextConcurrencyType)concurrencyType
NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:nil];
STAssertNotNil(mom, @"Can not create MOM from main bundle");
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
STAssertNotNil(psc, @"Can not create persistent store coordinator");
NSPersistentStore *store = [psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:0];
STAssertNotNil(store, @"Can not create In-Memory persistent store");
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:concurrencyType];
moc.persistentStoreCoordinator = psc;
return moc;
这是尝试在测试方法中使用该方法时的失败消息:
Undefined symbols for architecture i386:
"_NSInMemoryStoreType", referenced from:
-[CrosswordItemTests managedObjectContextWithConcurrencyType:] in CrosswordItemTests.o
"_OBJC_CLASS_$_NSEntityDescription", referenced from:
objc-class-ref in CrosswordItemTests.o
"_OBJC_CLASS_$_NSManagedObjectContext", referenced from:
objc-class-ref in CrosswordItemTests.o
"_OBJC_CLASS_$_NSManagedObjectModel", referenced from:
objc-class-ref in CrosswordItemTests.o
"_OBJC_CLASS_$_NSPersistentStoreCoordinator", referenced from:
objc-class-ref in CrosswordItemTests.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我以为我在 .h 文件中导入了所需的类:
#import <CoreData/CoreData.h>
我错过了什么?
【问题讨论】:
【参考方案1】:根据我的经验,i386 错误往往来自缺少库。仅将它们#import 到您的文件中是不够的,您还必须将它们添加到项目库中。进入 Project Target -> Build Phases -> Link Binary with Libraries 并根据您的情况添加与 Core Data 关联的库。
【讨论】:
Aaaaaaaaaah,我不知道我必须将 CoreData 链接两次——第一次链接到正常构建目标,第二次链接到测试构建目标。这解决了我的问题,感谢两者!【参考方案2】:您可能尚未将库链接到目标。
取自:http://yannickloriot.com/wp-content/uploads/2012/03/Link-CoreData-Framework-To-The-Project.png
【讨论】:
【参考方案3】:将“No Common Blocks”从 Yes 更改为 No(在 Targets->Build Settings->Apple LLVM - Code Generation 下)解决了这个问题。 这解决了我的问题。希望对你有帮助。
【讨论】:
以上是关于在 OCUnit 中使用核心数据类的 Apple Mach-O 链接器错误的主要内容,如果未能解决你的问题,请参考以下文章
将 OCUnit 测试框架添加到现有 Xcode 项目时遇到问题