2012-04-20 33 views
23

Ich möchte eine Inline-Funktion schreiben, aber ich bekomme einen Fehler. Wie kann ich es reparieren?Inline-Funktion "undefinierte Symbole" Fehler

Fehlerinformationen:

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) 

Code:

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

keine Antwort verwenden, kann aber nicht einfach CGRectContainsPoint verwenden, anstatt Ihre eigenen Walz? – jrturton

+0

Kompilieren mit dem -O2-Optimierungsschalter funktionierte für mich, wie in http://StackOverflow.com/questions/18939482/clang-linker-fails-i-f-at-least-o2-wasnt-used und eine andere Frage kann ich nicht länger finden. – devon

Antwort

34

Clang defaults to C99 und nicht GNU sematics, die ein rohes inline Mittel sowohl verschieden von static inline und extern inline.

Insbesondere eine rohe inline bedeutet, dass die Funktion noch externe Verknüpfung hat, aber die Inline-Definition bietet keine externe (Sie benötigen extern inline dafür).

Das bedeutet, dass Sie eine zusätzliche extern Definition in einer anderen Übersetzungseinheit benötigen oder die Verknüpfung fehlschlägt. Sie suchen jedoch wahrscheinlich nach static inline.

+0

Das ist richtig. Yay! Und danke. – Daniel

+0

Beachten Sie, dass zu dem Zeitpunkt, als XCode 8.1 veröffentlicht wurde (2016-10-27), die Standardsprache für (Apples Veröffentlichung von) 'clang' nicht mehr C99, sondern C11 war. GCC 5.0 und höher ist auch standardmäßig auf C11 (zuvor jedoch auf C90 voreingestellt). Dies ist nur ein kleines Detail; Es hat keinen Einfluss auf den Rest der Antwort. –

0

Ich denke, XYInRect() Bedürfnisse vor bekannt werden, verwendet wird. Verschieben Sie die Funktionsdefinition an eine bestimmte Stelle in der Datei, bevor Sie sie aufrufen.

+0

das wäre eine Kompilierung und kein Verknüpfungsfehler – Christoph

0

Auch würde vorschlagen CGRectContainsPoint

Verwandte Themen