声明extern NSString导致链接器错误

这是荒谬的,即时尝试创build一个声音布尔应用程序的声音。 我不断收到

Undefined symbols for architecture i386: "_kPlaySoundPrefsKey", referenced from: -[AppDelegate application:didFinishLaunchingWithOptions:] in AppDelegate.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

我已经检查过,我的所有文件都是在构build阶段链接的,我已经删除了appdelegate .m,我甚至在调用任何视图控制器中的bool之前得到错误,然后在构build阶段重新导入它。 检查我有相关的framweworks到位。 我甚至检查了我使用相同代码创build的以前的应用程序,它的代码看起来完全一样,没有错误(使用以前版本的xcode构build)。 把它回到基础知识,只要我将下面的代码添加到我的应用程序委托,我得到的错误,

。H

 #import <UIKit/UIKit.h> extern NSString *kPlaySoundPrefsKey; @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end 

.M

 #import "AppDelegate.h" #import <AudioToolbox/AudioToolbox.h> @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { NSDictionary *defaultDict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kPlaySoundPrefsKey]; return YES; } 

如果我改变extern NSString *kPlaySoundPrefsKey;NSString *kPlaySoundPrefsKey; 它build立然后崩溃…现在想出来的想法

当你声明为extern东西时,你告诉编译器typesAND,你会在别的地方定义它。 在你的情况你永远不会定义你的variables。

所以在你的.h你会有:

 extern NSString* kPlaySoundPrefsKey; 

但在某些.m你也必须有

 NSString* kPlaySoundPrefsKey = @"play_sounds"; // or some value 

因为在你的情况下,这些是常量,你也可以指定:

 extern NSString* const kPlaySoundPrefsKey; 

 NSString* const kPlaySoundPrefsKey = @"play_sounds"; 

const限定符的join会导致编译器错误,如果有人曾经写过类似的东西

 kPlaySoundPrefsKey = @"some_other_value"; 

我也得到了同样的错误,即使我正确地宣布和定义外部常量string,问题是,我的常量文件不在编译源列表中。

确保您的.m文件出现在您的构build目标的“编译源”构build阶段。 有时,将文件添加到Xcode中的项目不会将所有实现文件添加到适当的目标。

希望这对一些人有帮助。 Refe: 链接器错误undefined-symbols-symbols-not-found

首先,确保它的定义:

 // AppDelegate.h extern NSString* const kPlaySoundPrefsKey; // << declaration // AppDelegate.m NSString * const kPlaySoundPrefsKey = @"kPlaySoundPrefsKey"; // << definition 

也可以看看:

只有“extern const”vs“extern”

在Objective-C项目中使用的3个关于extern的问题

在Objective-C代码中使用extern“C”链接器错误

谢谢你们的帮助

我补充说

NSString *kPlaySoundPrefsKey = @"playSoundKey";

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict];

到应用程序代理。 这固定它