15

这太荒谬了,我试图创建一个声音布尔来打开应用程序声音。我不断得到

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 之前我得到了错误,并在构建阶段重新导入它。检查我有相关的框架。我什至检查了我使用相同代码制作的以前的应用程序,它的代码似乎完全相同,没有错误(使用以前版本的 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

4 回答 4

18

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

因此,在您的 .h 中,您将拥有:

extern NSString* kPlaySoundPrefsKey;

但是在某些 .m 中,您还必须拥有

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

由于在您的情况下这些是常量,您还可以指定:

extern NSString* const kPlaySoundPrefsKey;

NSString* const kPlaySoundPrefsKey = @"play_sounds"; 

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

kPlaySoundPrefsKey = @"some_other_value";
于 2012-08-30T00:53:14.760 回答
7

I am also got the same error even if I am properly declared and define the extern const string , The problem is, my constant file not in the compile source list .

Make sure that your .m file appears in the "Compile Sources" Build Phase for your build target. Sometimes, adding files to a project in Xcode doesn't add all implementation files to the appropriate targets.

Hope this will helpful for some people. Refe: linker-error-undefined-symbols-symbols-not-found

于 2012-09-29T08:29:32.013 回答
4

首先,确保它已定义:

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

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

也可以看看:

仅“extern const”与“extern”

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

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

于 2012-08-30T00:44:49.943 回答
0

谢谢你们的帮助

我添加了

NSString *kPlaySoundPrefsKey = @"playSoundKey";

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict];

到应用程序委托。那解决了它

于 2012-08-31T08:50:26.393 回答