Apple Mach-O Linker Error using Core Data classes in OCUnit
Asked Answered
E

3

5

OK, here's my code in my test class:

 - (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;
}

And here's the failure message when trying to use the method in a test method:

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)

I thought I imported the needed classes like that in the .h file:

#import <CoreData/CoreData.h>

What am I missing?

Eichler answered 3/7, 2012 at 14:19 Comment(0)
C
15

In my experience i386 errors tend to come from missing libraries. Its not enough to just #import them in your file, you must also add them to the project libraries. Go into the Project Target -> Build Phases -> Link Binary with Libraries and in your case add the libraries associated with Core Data.

Crosstie answered 3/7, 2012 at 14:38 Comment(1)
Aaaaaaaaah, I didn't know that I have to link CoreData twice – first to the normal build target AND second to the test build target. That solves my issues, thanks to both!Eichler
T
8

You probably haven't linked the library to the target.

enter image description here

Taken from: http://yannickloriot.com/wp-content/uploads/2012/03/Link-CoreData-Framework-To-The-Project.png

Tendency answered 3/7, 2012 at 14:24 Comment(0)
P
0

Changing 'No Common Blocks' from Yes to No (under Targets->Build Settings->Apple LLVM - Code Generation) fixed the problem. This fixed my problem. Hope it will help to you.

Pteropod answered 11/7, 2017 at 7:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.