这很荒谬,我试图创造一个声音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;
它会构建然后崩溃...我现在没有想法
答案 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 :(得分:-1)
感谢您的帮助
我添加了
NSString *kPlaySoundPrefsKey = @"playSoundKey";
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict];
到app委托。修好了