Ошибка компоновщика при вызове 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++?