2012-04-20 14 views
23

インライン関数を作成したいが、エラーが発生する。どうすれば修正できますか?インライン関数「未定義シンボル」エラー

エラー情報:

Undefined symbols for architecture i386: 
    "_XYInRect", referenced from: 
     -[BeginAnimation ccTouchesEnded:withEvent:] in BeginAnimation.o 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

コード:

CGPoint location = CGPointMake(60, 350); 

if (XYInRect(location, 53, 338, 263, 369)) { 

} 

inline BOOL XYInRect(CGPoint location, float MixX, float MixY, float MaxX ,float MaxY){ 
    if (location.x >MixX && location.y >MixY && location.x <MaxX && location.y <MaxY) { 
     return YES; 
    } else { 
     return NO; 

    } 
} 
+4

ない答えを使用することをお勧めしますが、あなたは自分自身をロールするのではなく、CGRectContainsPointを使用することはできませんか? – jrturton

+0

http://StackOverflow.com/questions/18939482/clang-linker-fails-if-at-least-o2-wasnt-usedで提案されているように、-O2最適化スイッチでコンパイルすると私にとってうまくいきました。長い見つける。 – devon

答えて

34

クランdefaults to C99なくGNU sematicsは、static inlineextern inline両方と異なります。

特に、未加工のinlineは、この機能にはまだ外部リンケージがありますが、インライン定義では外部定義は提供されません(extern inlineが必要です)。

これは、別の翻訳単位で追加のextern定義が必要な場合、リンクが失敗することを意味します。しかし、あなたはおそらくstatic inlineを探しています。

+0

これは正しいです。わーい!ありがとう。 – Daniel

+0

XCode 8.1がリリースされるまで(2016-10-27)、(Appleのリリースの) 'clang'のデフォルト言語はもはやC99ではなくC11であったことに注意してください。 GCC 5.0以降では、デフォルトでC11に設定されています(以前はデフォルトでC90に設定されていました)。これはほんの微妙なものです。それは答えの残りの部分には影響しません。 –

0

私はXYInRect()が使用される前に知られている必要があると思います。関数定義を呼び出す前に、ファイル内のある場所に移動します。生inlineを意味

+0

これはコンパイルであり、リンクエラーではありません – Christoph

0

はまたCGRectContainsPoint

関連する問題