2010-12-16 3 views
14

다음 파일이 있습니다.Objective C에서 C++ 메서드 호출

foo.h (C++ 헤더 파일)
foo.mm (C++ 파일)
test_viewcontroller.h (목적 C 헤더 파일)
test_viewcontroller.m (목적 C 파일)

내가 선언 한 방법 foo.h에 donothing() 및 foo.mm.Lets에 정의는

donothing 두 (더블) {A를 반환 말한다; }

는 지금, 나는 test_viewcontroller.m에

더블 VAR = donothing (의 somevar을)이 함수를 호출하려고;

나는 test_viewcontroller.o
collect2에서 _donothing() "를 문자를 찾을 수 없습니다"라는 링커 오류가 발생합니다 : LD는

사람이 무엇이 잘못되었는지에 나를 가리켜 주시겠습니까 1 종료 상태

를 반환?



나 정확한하자 :

#ifdef __cplusplus 

extern "C" 
{ 
     char UTMLetterDesignator(double Lat); 
     NSString * LLtoUTM(double Lat,double Long,double UTMNorthing, double UTMEasting); 
     double test(double a); 
} 

#endif 

@Carl

나는 ifdef.I 만 테스트() 메소드를 마무리해야한다는 말을 내 코드 sample.Are를 포함했다

무슨 차이가 있는지 이해하지 못해. 설명해 줄 수 있니?

답변

34

test_viewcontroller.mdonothing()의 C++이 아닌 기호를 사용하는 심볼 이름을 찾고 있습니다. 확장자를 .mm으로 변경하면 좋을 것입니다. 또는 C++ 파일을 컴파일 할 때 extern "C" 선언을 메서드 선언에 foo.h에 넣습니다.

foo.h :

#ifdef __cplusplus 
extern "C" { 
#endif 

double donothing(double a); 

#ifdef __cplusplus 
} 
#endif 

foo.mm :

#include "foo.h" 

double donothing(double a) 
{ 
    return a; 
} 

test_viewcontroller.m :

#import "foo.h" 

- (double)myObjectiveCMethod:(double)x 
{ 
    return donothing(x); 
} 
+1

I

당신은 다음과 같이 갖고 싶어 extern "c"를 추가하려고했는데 새로운 오류가 나타납니다. "Expected iden tifier 또는 '('문자열 상수 앞에 " – Janani

+0

@whoocares, C++의 경우에만 extern"C "를 추가해야합니다. 즉,'#ifdef __cplusplus' 블록으로 감싸는 것을 의미합니다. –

+0

@Carl - 답변 해 주셔서 감사합니다. 링커 오류가 사라졌습니다! 하지만 "test_viewcontroller.m"- 함수 "donothing()"의 암시 적 선언에 새로운 경고가 있습니다.이 경우에만 함수 선언이있는 헤더 파일을 포함하지 않은 것으로 믿습니다.하지만 가져온 foo.h 있습니다 "test_viewcontroller.m"에서. 무엇이 잘못되었는지 말해 주시겠습니까? – Janani

관련 문제