Ошибка компоновщика, вызывающая C-функцию из Objective-C ++

У меня странная проблема с компоновщиком. У меня есть код, который выглядит так:

    double given_amount = self.modelController.levelCompleteRewardAmount;
    swrve_currency_given(swrve, (CFStringRef)@"currencyName", given_amount);

У меня этот код в двух разных местах: в файле objective-c и objective-c ++. Он компилируется в области objective-c, но функция swrve_currency_given() вызывает следующее в моем файле WGController.mm:

Undefined symbols for architecture armv7:
  "swrve_currency_given(Swrve*, __CFString const*, double)", referenced from:
      -[WGController giveTheUserSomeCashForPlayingThisLevel] in WGController.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status

Я не совсем уверен, связана ли эта ошибка с Obj-C против С++, но похоже. Моя теория состоит в том, что она, возможно, думает, что это функция класса Obj-C? Код "swrve" - это сторонний код, один .h и .c файл, и я импортирую так:

#import "swrve.h"

Любая помощь приветствуется! Благодаря

Ответ 1

Возможно, вам необходимо окружить прототип функции:

#if defined __cplusplus
extern "C" {
#endif

void swrve_currency_given (...whatever goes here...);

#if defined __cplusplus
};
#endif

Это говорит компилятору, что это функция C, а не С++.

Ответ 2

Если вы используете c-функцию в файле С++. вы должны использовать extern "c"{}. В .h файле

#ifdef __cplusplus
extern "C" {
#endif

swrve_currency_given(parameter1, parameter2, parameter3);// a c function


#ifdef __cplusplus
}
#endif  

extern "C" предназначен для распознавания компилятором С++ и для уведомления компилятор, что отмеченная функция (или должна быть) скомпилирована в C стиль.

Если вы связываетесь с библиотекой, которая была скомпилирована как код C. использовать

extern "C" {
  #include "c_only_header.h"
}

Взгляните на Когда использовать extern "C" в С++?