奇妙なリンカーの問題があります。私は次のようなコードを持っています:
double given_amount = self.modelController.levelCompleteRewardAmount;
swrve_currency_given(swrve, (CFStringRef)@"currencyName", given_amount);
私はこのコードを2つの別々の場所に持っています: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とC++の関係に関連しているかどうかは完全にはわかりませんが、感じ好きです。私の理論は、おそらくそれがObj-Cクラスの関数であると考えているということですか? 'swrve'コードはサードパーティのコードであり、1つの.hおよび.cファイルであり、次のようにインポートしています。
#import "swrve.h"
どんな助けでも大歓迎です!ありがとう
関数プロトタイプを次のように囲む必要がある場合があります。
#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スタイルでコンパイルされている(またはコンパイルされる)ことをコンパイラに通知することを目的としています。
Cコードとしてコンパイルされたライブラリにリンクしている場合。使用する
extern "C" {
#include "c_only_header.h"
}
C++でextern "C"を使用する場合 を見てください。