2012-04-20 11 views
23

Quiero escribir una función en línea, pero aparece un error. ¿Cómo puedo arreglarlo?Error "símbolos indefinidos" de la función en línea

Información de error:

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) 

Código:

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

una respuesta, pero no puedes usar CGRectContainsPoint en vez de rodar su propio? – jrturton

+0

La compilación con el modificador de optimización -O2 funcionó para mí, como se sugiere en http://StackOverflow.com/questions/18939482/clang-linker-fails-if-at-least-o2-wasnt-used y otra pregunta que no puedo más tiempo encontrar. – devon

Respuesta

34

Clang defaults to C99 y no GNU sematics, lo que significa una prima inline es diferente tanto de static inline y extern inline.

En particular, un inline crudo significa que la función todavía tiene un enlace externo, pero la definición en línea no proporciona la externa (para eso necesitaría extern inline).

Lo que esto significa es que necesita una definición adicional extern en una unidad de traducción diferente o la conexión fallará. Sin embargo, probablemente esté buscando static inline.

+0

Esto es correcto. ¡Hurra! Y gracias. – Daniel

+0

Tenga en cuenta que para cuando se lanzó XCode 8.1 (2016-10-27), el idioma predeterminado para (lanzamiento de Apple) 'clang' ya no era C99 sino C11. GCC 5.0 y posterior también se establece de forma predeterminada en C11 (pero anteriormente estaba predeterminado en C90). Esto es solo un detalle menor; no afecta el resto de la respuesta. –

0

creo XYInRect() Se necesita saber antes de ser utilizado. Mueva la definición de la función a algún lugar en el archivo antes de llamarlo.

+0

que sería una compilación y no un error de enlace – Christoph

0

También se recomienda usar CGRectContainsPoint

No
Cuestiones relacionadas