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)

すべてのファイルがビルド フェーズでリンクされていることを確認しました。ビュー コントローラで bool を呼び出す前にエラーが発生する appdelegate .m を削除し、ビルド フェーズで再インポートしました。関連するフレームワークが整っていることを確認しました。同じコードで作成した以前のアプリもチェックしましたが、コードはエラーなしでまったく同じように見えます(以前のバージョンの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

extern const文字列を適切に宣言して定義しても、同じエラーが発生します。問題は、定数ファイルがコンパイルソースリストにないことです。

ビルドターゲットの「ソースのコンパイル」ビルドフェーズに.mファイルが表示されていることを確認してください。Xcodeでプロジェクトにファイルを追加しても、すべての実装ファイルが適切なターゲットに追加されない場合があります。

これが一部の人々に役立つことを願っています。参照: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 コードで extern "C" を使用するとリンカー エラーが発生する

于 2012-08-30T00:44:49.943 に答える
0

助けてくれてありがとう

追加した

NSString *kPlaySoundPrefsKey = @"playSoundKey";

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict];

アプリデリゲートへ。それはそれを修正しました

于 2012-08-31T08:50:26.393 に答える