Apple Mach-O Linker Error: 1 duplicate symbol for architechture

Apple Mach-O Linker Error: 1 duplicate symbol for architechture

这是我在 Xcode 中 运行 我的项目时遇到的错误:

重复符号 _coinsTotal 在:

/Library/Developer/Xcode/DerivedData/AppName-fqlzuwivxudvndbinqsoudxkdzrg/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/i386/ViewController.o

/Library/Developer/Xcode/DerivedData/AppName-fqlzuwivxudvndbinqsoudxkdzrg/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/i386/AppDelegate.o

ld: 架构 i386 的 1 个重复符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

错误发生是因为我在我的 AppDelegate.m 中导入了我的 ViewController.h 但我需要这样做以便在我的奖励视频播放后添加硬币总数。我已经在其他应用程序中将我的 ViewController.h 添加到我的 AppDelegate.m,没有出现任何错误。

有什么想法或建议吗?谢谢!

这是我在顶部 ViewController.h 文件中的代码:

#import <UIKit/UIKit.h>

#import <Chartboost/Chartboost.h>



int coinsTotal;
int pointsLeft;
int dailyTwenty;


@interface ViewController : UIViewController <UIActionSheetDelegate>

这是我的 AppDelegate.m 文件的代码:

#import "AppDelegate.h"

#import "ViewController.h"

#import <CommonCrypto/CommonDigest.h>
#import <AdSupport/AdSupport.h>
#import <Chartboost/Chartboost.h>
#import <Chartboost/CBNewsfeed.h>

@interface AppDelegate ()<ChartboostDelegate>

@end

@implementation AppDelegate

您在 header 文件中将三个 int 值声明为全局变量。在你的代码中任何包含这个 header 的地方,你都会成为 defining/redefining 他们。

您可以在 header 文件中将它们声明为外部:

/* in ViewController.h */
extern int coinsTotal;
extern int pointsLeft;
extern int dailyTwenty;

然后在@implementation 代码之外的 AppDelegate.m 顶部声明一次。

/* in AppDelegate.m */
int coinsTotal = 0;
int pointsLeft = 0;
int dailyTwenty = 0;
...

@implementation AppDelegate
...
@end

但我更愿意将它们创建为单例 class 的成员,然后在需要设置或读取值的地方包含接口 header 文件。

形成你的代码,重复符号的原因是你在 "ViewController.h":

中声明了三个全局变量
int coinsTotal;
int pointsLeft;
int dailyTwenty;

解决这个问题,在.h文件中声明为"extern",然后在.m文件中声明:

/* in ViewController.h */
extern int coinsTotal;
extern int pointsLeft;
extern int dailyTwenty;

/*in ViewController.m*/
int coinsTotal = 0;
int pointsLeft = 0;
int dailyTwenty = 0;

基本上,重复符号有以下三个原因:

  • 包含 .m 文件而不是 .h
  • 在 .h 文件中声明全局变量或符号并将其包含在其他地方
  • 导入周期。例如A导入B,B导入C,C导入A...

就我而言,导入 .m 而不是 .h 会导致重复符号。