2012-04-20 20 views
23

Chcę napisać funkcję inline, ale pojawia się błąd. Jak mogę to naprawić?Funkcja Inline "niezdefiniowane symbole" błąd

informacja o błędzie:

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) 

Kod:

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

nie odpowiedź, ale nie można po prostu użyć CGRectContainsPoint zamiast toczenia własne? – jrturton

+0

Kompilacja z przełącznikiem optymalizacji -O2 zadziałała dla mnie, jak zasugerowałem w http://StackOverflow.com/questions/18939482/clang-linker-fails-if-at-least-o2-wasnt-used i innym pytaniu, którego nie mogę dłużej znaleźć. – devon

Odpowiedz

34

Clang defaults to C99 nie GNU sematics, czyli surowej inline różni się zarówno od static inline i extern inline.

W szczególności surowy inline oznacza, że ​​funkcja nadal ma połączenie zewnętrzne, ale definicja wstawkowa nie zapewnia zewnętrznej (w tym przypadku potrzebna jest extern inline).

Oznacza to, że potrzebna jest dodatkowa definicja extern w innej jednostce tłumaczeniowej lub połączenie zakończy się niepowodzeniem. Jednak prawdopodobnie szukasz static inline.

+0

To się zgadza. Yay! I dzięki. – Daniel

+0

Należy zauważyć, że przed wydaniem XCode 8.1 (2016-10-27), domyślnym językiem dla (wydania Apple) 'clang' nie było już C99, ale C11. GCC 5.0 i nowsze także domyślnie C11 (ale wcześniej domyślnie C90). To tylko drobny szczegół; nie wpływa to na resztę odpowiedzi. –

0

myślę XYInRect() musi być znany przed użyciem. Przenieś definicję funkcji do jakiegoś miejsca w pliku, zanim zadzwonisz.

+0

, który byłby kompilacją, a nie błędem łączenia. – Christoph

0

także sugerowałoby użyciu CGRectContainsPoint

Powiązane problemy