Вызов метода С++ из Objective C

У меня есть следующие файлы.

foo.h(заголовочный файл С++)
foo.mm(файл С++)
test_viewcontroller.h(файл заголовка цели c)
test_viewcontroller.m(Objective c file)

Я объявил метод donothing() в foo.h и определил его в foo.mm.Lets say it

двойное далекое (двойное a) {      return a; }

Теперь я пытаюсь вызвать эту функцию в test_viewcontroller.m

double var = donothing (somevar);

Я получаю ошибку компоновщика, которая говорит "не может найти символы" _donothing() в test_viewcontroller.o
collect2: 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

Я включил свой пример кода. Говоря, что мне нужно обернуть только метод test() в ifdef.I не понимаю, какую разницу он может сделать. Можете ли вы объяснить?

Ответы

Ответ 1

test_viewcontroller.m ищет имя символа, не связанного с С++, для donothing(). Измените его расширение на .mm, и вы должны быть хорошими. В качестве альтернативы поместите объявление 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);
}