链接器错误,重复的符号

看来我试图编译时有一个错误,它似乎直接指向两个文件..MenuViewController和FirstTopViewController。 我认为它与我的导入有关,因为它们中的每一个都正在导入另一个,但是错误是引用了我的Building对象,而这个对象几乎没有用到。 此外,随着铛错误,我该如何使用-v来查看调用?

错误:

ld: duplicate symbol _OBJC_CLASS_$_Building in /Users/alexmuller/Library/Developer/Xcode/DerivedData/ECSlidingViewController-gjxwxiwumgohyehiawnlamggzmop/Build/Intermediates/ECSlidingViewController.build/Debug-iphonesimulator/ECSlidingViewController.build/Objects-normal/i386/FirstTopViewController.o and /Users/alexmuller/Library/Developer/Xcode/DerivedData/ECSlidingViewController-gjxwxiwumgohyehiawnlamggzmop/Build/Intermediates/ECSlidingViewController.build/Debug-iphonesimulator/ECSlidingViewController.build/Objects-normal/i386/MenuViewController.o for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

FirstTopViewController.h

 #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> #import "ECSlidingViewController.h" #import "MenuViewController.h" #import "TimesViewController.h" #import "BuildingViewController.h" #import "BuildingAnnotation.h" #import <MapKit/MapKit.h> @class BuildingViewController; @interface FirstTopViewController : UIViewController <MKMapViewDelegate> { IBOutlet MKMapView *_map; BuildingViewController *buildingVC; BuildingAnnotation *buildAnnotation; } @property (nonatomic, strong) MKMapView *map; - (IBAction)revealMenu:(id)sender; - (IBAction)revealTimes:(id)sender; - (void)loadBuilding:(Building *)building; @end 

FirstTopViewController.m

 #import "FirstTopViewController.h" @implementation FirstTopViewController @synthesize map = _map; - (void)viewDidLoad { buildingVC = (BuildingViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"BuildingList"]; [super viewDidLoad]; } - (void)viewWillAppear:(BOOL)animated { [(UIView *)[self.view viewWithTag:10] setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"RedWithNoise"]]]; [super viewWillAppear:animated]; [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"toolbar"] forBarMetrics:UIBarMetricsDefault]; [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: [UIColor colorWithRed:204.0/255.0 green:204.0/255.0 blue:102.0/255.0 alpha:1.0], UITextAttributeTextColor, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8], UITextAttributeTextShadowColor, [NSValue valueWithUIOffset:UIOffsetMake(0, -1)], UITextAttributeTextShadowOffset, [UIFont fontWithName:@"AGaramondPro-Regular" size:23.0], UITextAttributeFont, nil]]; self.view.layer.shadowOffset = CGSizeZero; self.view.layer.shadowOpacity = 0.75f; self.view.layer.shadowRadius = 10.0f; self.view.layer.shadowColor = [UIColor blackColor].CGColor; self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.layer.bounds].CGPath; self.view.clipsToBounds = NO; MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2DMake(30.451667, -84.268533), 16090.344, 16090.344); viewRegion = [_map regionThatFits:viewRegion]; [_map setRegion:viewRegion animated:YES]; if (![self.slidingViewController.underLeftViewController isKindOfClass:[MenuViewController class]]) { self.slidingViewController.underLeftViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Menu"]; } if (![self.slidingViewController.underRightViewController isKindOfClass:[TimesViewController class]]) { self.slidingViewController.underRightViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Times"]; } [self.view addGestureRecognizer:self.slidingViewController.panGesture]; } - (void)loadBuilding:(Building *)building { if (buildingVC.buildingSelected) { if (buildAnnotation != nil) { [_map removeAnnotation:buildAnnotation]; } NSLog(@"%@", building.getName); buildAnnotation = [[BuildingAnnotation alloc] initWithCoordinate:building.getLocation.coordinate withName:building.getName withAddress:building.getAddress]; [_map setCenterCoordinate:buildAnnotation.coordinate animated:YES]; [_map addAnnotation:buildAnnotation]; } } - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { self.view.layer.shadowPath = nil; self.view.layer.shouldRasterize = YES; } - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.layer.bounds].CGPath; self.view.layer.shouldRasterize = NO; } - (IBAction)revealMenu:(id)sender { [self.slidingViewController anchorTopViewTo:ECRight]; } - (IBAction)revealTimes:(id)sender { [self.slidingViewController anchorTopViewTo:ECLeft]; } @end 

MenuViewController.h

 #import <UIKit/UIKit.h> #import "ECSlidingViewController.h" #import "FirstTopViewController.h" #import "TimesViewController.h" @interface MenuViewController : UIViewController <UITableViewDataSource, UITabBarControllerDelegate> { NSIndexPath *selectedIndex; } @end 

MenuViewController.m

 #import "MenuViewController.h" typedef enum { ENGINEERING, GARNET, GOLD, HERITAGE, NIGHT, OSCEOLA, RENEGADE, TOMAHAWK } RouteName; @interface MenuViewController() @property (nonatomic, strong) NSArray *menuItems; @property (nonatomic, strong) NSArray *optionItems; @property (nonatomic, strong) NSArray *arrayItems; - (UIImage *)determineActiveRoute:(RouteName)route; @end @implementation MenuViewController @synthesize menuItems, optionItems, arrayItems; - (void)awakeFromNib { self.menuItems = [NSArray arrayWithObjects:@"Engineering", @"Garnet", @"Gold", @"Heritage Grove", @"Night Nole", @"Osceola", @"Renegade", @"Tomahawk", nil]; self.optionItems = [NSArray arrayWithObjects:@"Buildings", @"Directions", nil]; self.arrayItems = [NSArray arrayWithObjects:self.menuItems, self.optionItems, nil]; } - (void)viewDidLoad { [super viewDidLoad]; [self.slidingViewController setAnchorRightRevealAmount:200.0f]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex { return [[self.arrayItems objectAtIndex:sectionIndex] count]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [self.arrayItems count]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 35; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *sectionView = [[UIView alloc] init]; [sectionView sizeToFit]; sectionView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"navCellDivider"]]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 100, 20)]; label.textColor = [UIColor grayColor]; label.backgroundColor = [UIColor clearColor]; label.font = [UIFont fontWithName:@"AGaramondPro-Regular" size:12.0]; if(section == 0) label.text = @"BUS ROUTES"; else label.text = @"OTHER OPTIONS"; [sectionView addSubview:label]; return sectionView; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 20; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UILabel *label; UIImageView *imageView; NSString *cellIdentifier = @"MenuItemCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } UIView *selectedView = [[UIView alloc] initWithFrame:cell.frame]; selectedView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"navCellBackgroundSelected"]]; cell.selectedBackgroundView = selectedView; cell.contentView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"navCellBackground"]]; label = (UILabel *)[cell.contentView viewWithTag:100]; label.font = [UIFont fontWithName:@"AGaramondPro-Regular" size:15.0]; label.text = [[self.arrayItems objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; imageView = (UIImageView *)[cell.contentView viewWithTag:101]; if (indexPath.section == 0) { [imageView setImage:[self determineActiveRoute:indexPath.row]]; } else { if (indexPath.row == 0) { [imageView setImage:[UIImage imageNamed:@"building"]]; } else { [imageView setImage:[UIImage imageNamed:@"60-signpost"]]; } } return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { /* Type cast view as a First Top to make it easier to read. Do switch to select correct route, then modify map afterwards to load up correct route. TimesViewController can be set to the corresponding times when selected */ FirstTopViewController *mapViewController = (FirstTopViewController *)self.slidingViewController.topViewController; TimesViewController *timesViewController = (TimesViewController *)self.slidingViewController.underRightViewController; if (indexPath.section == 0) { selectedIndex = indexPath; switch (indexPath.row) { case ENGINEERING: NSLog(@"Engineering Selected\n"); timesViewController.times.text = @"Engineering"; break; case GARNET: NSLog(@"Garnet Selected\n"); timesViewController.times.text = @"Garnet"; break; case GOLD: NSLog(@"Gold Selected\n"); timesViewController.times.text = @"Gold"; break; case HERITAGE: NSLog(@"Heritage Grove Selected\n"); timesViewController.times.text = @"Heritage Grove"; break; case NIGHT: NSLog(@"Night Nole Selected\n"); timesViewController.times.text = @"Night Nole"; break; case OSCEOLA: NSLog(@"Osceola Selected\n"); timesViewController.times.text = @"Osceola"; break; case RENEGADE: NSLog(@"Renegade Selected\n"); timesViewController.times.text = @"Renegade"; break; case TOMAHAWK: NSLog(@"Tomahawk Selected\n"); timesViewController.times.text = @"Tomahawk"; break; default: break; } } else { if (indexPath.row == 0) { BuildingViewController *buildings = [self.storyboard instantiateViewControllerWithIdentifier:@"BuildingList"]; buildings.userLoc = [[CLLocation alloc] initWithLatitude:mapViewController.map.userLocation.coordinate.latitude longitude:mapViewController.map.userLocation.coordinate.longitude]; [self presentModalViewController:buildings animated:YES]; } [tableView deselectRowAtIndexPath:indexPath animated:NO]; [tableView selectRowAtIndexPath:selectedIndex animated:YES scrollPosition:UITableViewScrollPositionNone]; } [self.slidingViewController anchorTopViewTo:ECRight animations:nil onComplete:^{ [self.slidingViewController resetTopView]; }]; } - (UIImage *)determineActiveRoute:(RouteName)route { NSCalendar *gregorianCalender = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [gregorianCalender components:NSHourCalendarUnit fromDate:[NSDate date]]; switch (route) { case ENGINEERING: if ([components day] % 7 == 2) { if (([components hour] >= 7) && ([components hour] < 17)) { return [UIImage imageNamed:@"green"]; } else { return [UIImage imageNamed:@"red"]; } } else if (([components day] % 7 == 3) || ([components day] % 7 == 4)) { return [UIImage imageNamed:@"red"]; } else { //Weekday if (([components hour] >= 7) && ([components hour] < 19)) { return [UIImage imageNamed:@"green"]; } else { return [UIImage imageNamed:@"red"]; } } break; case GARNET: case GOLD: case HERITAGE: if ((([components day] % 7 <= 3) || ([components day] % 7 >= 5)) && (([components hour] >= 7) && ([components hour] <= 19))) { return [UIImage imageNamed:@"green"]; } else { return [UIImage imageNamed:@"red"]; } break; case NIGHT: if ((([components day] % 7 == 6) || ([components day] % 7 <= 3)) && (([components hour] >= 22.5) || ([components hour] <= 3))) { return [UIImage imageNamed:@"green"]; } else { return [UIImage imageNamed:@"red"]; } break; case OSCEOLA: case RENEGADE: case TOMAHAWK: if ((([components day] % 7 <= 3) || ([components day] % 7 >= 5)) && (([components hour] >= 7) && ([components hour] <= 19))) { return [UIImage imageNamed:@"green"]; } else { return [UIImage imageNamed:@"red"]; } break; } } @end 

按您的要求 :

从编译源中删除所有类,然后单击+buttonsearch术语“.m”。 突出显示每个class级,然后点击添加。 build立并再次运行。

检查是否没有导入.m文件,它应该是.h文件。 卫生署!

不知道,但有一些事情可能是。

  1. 我注意到这两个类都没有导入Building.h,所以我的第一个想法是编译器不知道从哪里得到这个类的信息。 你需要添加#import吗?

  2. 接下来的事情是我通常尽量避免有两个相互导入的类。 编译可能会遇到问题,试图找出编译它们的顺序。您可能需要将其中的一个更改为使用@class ...而不是#import ...以便编译器将其@class ...到运行时parsing该类。

  3. 最后你做了干净的? 有些时候,重构很多时候,旧的类定义会留在构build目录中,并可能导致这样的问题。

删除文件并select“删除参考”。 将文件再次拖回到项目,应该没问题。 这对我有效。

造成这个问题的原因是我复制了一个m文件,但没有重命名@implementation。 确保您没有重复的@implementation声明。

将具有多个* .a文件的第三方库导入到我的IOS项目时,我遇到了类似的错误。 在我的情况下,删除“-all_load”链接器标志解决了这个问题。