Ошибка компоновщика, вызывающая 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" в С++?