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

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

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

У меня есть этот код в двух отдельных местах: в файле Objective-C и файл Objective-C++. Он хорошо компилируется в целевой-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 и C++, но похоже, что так. Моя теория состоит в том, что он, возможно, думает, что это функция класса Obj-C? Код swrve - это сторонний код, один файл.h и.c, и я импортирую его так:

#import "swrve.h"

Любая помощь приветствуется! Спасибо

2 ответа

Решение

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

#if defined __cplusplus
extern "C" {
#endif

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

#if defined __cplusplus
};
#endif

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

Если вы используете функцию c в файле 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" в C++?

Другие вопросы по тегам