web-dev-qa-db-ja.com

Objective-C ++からC-Functionを呼び出すリンカーエラー

奇妙なリンカーの問題があります。私は次のようなコードを持っています:

    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"

どんな助けでも大歓迎です!ありがとう

26
Chris Hill

関数プロトタイプを次のように囲む必要がある場合があります。

#if defined __cplusplus
extern "C" {
#endif

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

#if defined __cplusplus
};
#endif

これは、それがC関数であり、C++関数ではないことをコンパイラーに通知します。

46
user1118321

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"を使用する場合 を見てください。

9
Parag Bafna