声明extern NSString会导致链接器错误

时间:2012-08-29 21:14:54

标签: objective-c ios xcode boolean

这很荒谬,我试图创造一个声音bool来转换应用声音。我一直在

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)

我已经检查过我的所有文件都是在构建阶段链接的,我已经删除了appdelegate .m,我甚至在我的任何视图控制器中调用bool之前得到了错误,并在构建阶段重新导入它。检查我有相关的framweworks到位。我甚至检查过我使用相同代码制作的以前的应用程序,它看起来完全相同,没有错误(使用以前版本的xcode构建)。将其恢复到基础知识我将以下代码添加到我的App Delegate后立即收到错误

·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;它会构建然后崩溃...我现在没有想法

4 个答案:

答案 0 :(得分:18)

当您将某些内容声明为extern时,您告诉编译器类型和您将在其他位置定义它。在您的情况下,您永远不会定义您的变量。

所以在你的.h中你会有:

extern NSString* kPlaySoundPrefsKey;

但在某些情况下,你必须拥有

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

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

extern NSString* const kPlaySoundPrefsKey;

NSString* const kPlaySoundPrefsKey = @"play_sounds"; 

如果有人写过类似

的内容,添加const限定符将导致编译器错误
kPlaySoundPrefsKey = @"some_other_value";

答案 1 :(得分:7)

即使我正确声明并定义了extern const字符串,我也得到了同样的错误, 问题是,我的常量文件不在编译源列表中。

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

希望这对某些人有帮助。 参考:linker-error-undefined-symbols-symbols-not-found

答案 2 :(得分:4)

首先,确保定义:

// AppDelegate.h
extern NSString* const kPlaySoundPrefsKey; // << declaration

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

另见:

"extern const" vs "extern" only

3 questions about extern used in an Objective-C project

Linker error using extern "C" in Objective-C code

答案 3 :(得分:-1)

感谢您的帮助

我添加了

NSString *kPlaySoundPrefsKey = @"playSoundKey";

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict];

到app委托。修好了