objective-c - tutorial - objective c vs c++
Error de vinculador al llamar a la funciĆ³n C desde Objective-C++ (2)
Tengo un problema de enlazador raro Tengo un código que se ve así:
double given_amount = self.modelController.levelCompleteRewardAmount;
swrve_currency_given(swrve, (CFStringRef)@"currencyName", given_amount);
Tengo este código en dos lugares separados: en un archivo object-c y object-c ++. Se compila bien en la tierra del objetivo-C, pero la función swrve_currency_given () provoca lo siguiente en mi archivo 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
No estoy completamente seguro de si este error está relacionado con el objeto Obj-C vs. C ++, pero parece que sí. Mi teoría es que quizás piense que es una función en la clase Obj-C? El código ''swrve'' es un código de terceros, un archivo .h y .c y estoy importando así:
#import "swrve.h"
Cualquier ayuda es apreciada! Gracias
Es posible que deba rodear el prototipo de función con:
#if defined __cplusplus
extern "C" {
#endif
void swrve_currency_given (...whatever goes here...);
#if defined __cplusplus
};
#endif
Eso le dice al compilador que es una función C y no una función C ++.
Si está utilizando la función c en el archivo c ++. debe utilizar extern "c"{}
. En archivo .h
#ifdef __cplusplus
extern "C" {
#endif
swrve_currency_given(parameter1, parameter2, parameter3);// a c function
#ifdef __cplusplus
}
#endif
extern "C" está destinado a ser reconocido por un compilador de C ++ y notificar al compilador que la función anotada se compila (o se debe) compilar en estilo C.
Si está enlazando a una biblioteca que fue compilada como código C. utilizar
extern "C" {
#include "c_only_header.h"
}
Echa un vistazo a ¿ Cuándo usar extern "C" en C ++?