2010-12-16 21 views
14

Aşağıdaki dosyalar var.C++ yönteminin Objective C'den çağrılması

foo.h (C++ başlık dosyası)
foo.mm (C++ dosyası)
test_viewcontroller.h (objektif C başlık dosyası)
test_viewcontroller.m (Amaç C dosyası)

I bildirdikten bir yöntem foo.h olarak DoNothing() ve foo.mm.Lets içinde tanımlanan

çift DoNothing (çift) {bir geri olduğunu söyler; }

Şimdi, test_viewcontroller.m içinde

çift var = DoNothing (SomeVar) Bu fonksiyonu çağırmak için deneyin;

Ben test_viewcontroller.o
collect2 içinde _donothing() "sembolleri bulamıyorum" diyor bağlayıcı hatası alıyorum: ld

kimse yanlış ne olduğu beni işaret edebilir 1 çıkış durumunu

döndü?



beni kesin olalım:

#ifdef __cplusplus 

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

#endif 

@Carl

Ben ifdef.I sadece testi() yöntemini sarmak gerektiğini söyleyerek benim kod sample.Are dahil ettik

ne fark edebileceğini anlamıyorum. Lütfen açıklar mısınız?

cevap

34

test_viewcontroller.m, donothing() için C++ - karma olmayan bir sembol adı arıyor. Uzantısını .mm olarak değiştirin ve iyi olmalısınız. Alternatif olarak, C++ dosyasını derlerken foo.h numaralı yöntemle yöntem beyanınıza extern "C" bildirimi koyun.

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

ben

Bunu şuna benzer olmasını istiyorsanız extern "c" eklemeye çalıştı. ama yeni bir hata alıyorum - "Beklenen iden tifier veya '(' string sabitinden önce " – Janani

+0

@ whocares," extern "C" yi sadece C++ için eklemeniz gerekir - bu, bir # # fdef __cplusplus "bloğuna sarmak anlamına gelir. –

+0

@Carl - Cevabınız için çok teşekkürler! Linker hatası şimdi gitti! ama "test_viewcontroller.m" de yeni bir uyarı aldım - işlev "örtme()" örtük bildirimi. Bunun yalnızca işlev bildirimi olan başlık dosyasına dahil olmadığımda gerçekleşeceğine inanıyorum. Ama bir tane daha aldım. "test_viewcontroller.m" içinde. Lütfen bana neyin yanlış olduğunu söyleyin. – Janani