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

JSA*_*986 15 xcode boolean objective-c ios

这是荒谬的,我试图创建一个声音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)
Run Code Online (Sandbox Code Playgroud)

我已经检查过我的所有文件都是在构建阶段链接的,我已经删除了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
Run Code Online (Sandbox Code Playgroud)

.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;
}
Run Code Online (Sandbox Code Playgroud)

如果我改变extern NSString *kPlaySoundPrefsKey;NSString *kPlaySoundPrefsKey;它建立然后崩溃...林的想法,现在

idz*_*idz 18

当你extern在告诉编译器的时候声明某些东西时,你会在其他地方定义它.在您的情况下,您永远不会定义您的变量

所以在你的.h你会有:

extern NSString* kPlaySoundPrefsKey;
Run Code Online (Sandbox Code Playgroud)

但是在某些.m你也必须拥有

NSString* kPlaySoundPrefsKey = @"play_sounds"; // or some value
Run Code Online (Sandbox Code Playgroud)

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

extern NSString* const kPlaySoundPrefsKey;
Run Code Online (Sandbox Code Playgroud)

NSString* const kPlaySoundPrefsKey = @"play_sounds"; 
Run Code Online (Sandbox Code Playgroud)

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

kPlaySoundPrefsKey = @"some_other_value";
Run Code Online (Sandbox Code Playgroud)


Raj*_*Raj 7

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

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

希望这对一些人有帮助.Refe:链接器错误未定义符号符号未找到


JSA*_*986 0

谢谢你们的帮助

我添加了

NSString *kPlaySoundPrefsKey = @"playSoundKey";

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict];

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