Подтвердить что ты не робот

Объявление extern NSString вызывает ошибку компоновщика

Это смешно, я пытаюсь создать звук 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, где im получил ошибку, прежде чем я даже позвоню, чтобы вызвать 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;, он строит, затем сбой... Im из идей теперь

4b9b3361

Ответ 1

Спасибо за помощь ребятам

Я добавил

NSString *kPlaySoundPrefsKey = @"playSoundKey";

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict];

для делегата приложения. Это фиксировало его

Ответ 2

Когда вы объявляете что-то как extern, вы сообщаете компилятору тип AND, который вы определите в другом месте. В вашем случае вы никогда не определяете свою переменную.

Итак, в вашем .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";

Ответ 3

Я получаю ту же ошибку, даже если я правильно объявлен и определяю строку extern const, Проблема в том, что мой постоянный файл не находится в списке исходных файлов компиляции.

Убедитесь, что ваш файл .m отображается в разделе "Сборка источников" для вашей цели сборки. Иногда добавление файлов в проект в Xcode не добавляет все файлы реализации к соответствующим целям.

Надеюсь, это поможет некоторым людям. Refe: linker-error-undefined-symbols-symbols-not-found

Ответ 4

Сначала убедитесь, что он определен:

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

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

см. также:

"extern const" vs "extern" только

3 вопроса об использовании extern в проекте Objective-C

Ошибка компоновщика с использованием extern "C" в коде Objective-C