2012-02-17 9 views
26

リンカーに問題があります。私はこういうコードを持っています:Objective-C++からC-Functionを呼び出すときのリンカエラー

double given_amount = self.modelController.levelCompleteRewardAmount; 
    swrve_currency_given(swrve, (CFStringRef)@"currencyName", given_amount); 

このコードは、objective-cとobjective-C++ファイルの2つの別々の場所にあります。これは、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クラスの関数だと考えているということでしょうか?すべてのヘルプは高く評価され

#import "swrve.h"

:「をswrve」コードは、サードパーティのコード、1 .Hと.Cファイルであり、私はそうのようにインポートしています!それはCの関数ではなくC++の関数のコンパイラに指示します

#if defined __cplusplus 
extern "C" { 
#endif 

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

#if defined __cplusplus 
}; 
#endif 

: おかげ

+0

あなたはまた、リンカーのプロジェクトでそれをインポートしているを見てみましょうか?ターゲットのプロパティに移動し、概要ページで「リンクされたフレームワークとライブラリ」を開きます。 'swrve'ライブラリはそこにあるはずです。そうでない場合は、それを追加して、再度コンパイルしてみてください。 – dasblinkenlight

+0

ライブラリは静的なlib /フレームワークではなく、単に.cと.hファイルです。 (私はそれを反映するために私の質問を更新しました)。 –

答えて

45

あなたはとの関数プロトタイプを囲む必要があるかもしれません。

+0

それは働いたように見えますが、少年は追加するボイラープレートがたくさんあります!ありがとう! –

+0

私はブロックスコープを持たない 'extern" C "構文変種を使って変種を追加しました。これは定型文を一度行うだけで済むので、やや洗練されています。コメントのためには少し大きすぎましたが、編集はすぐに承認されるべきです。 – pmdj

9

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" 
} 

When to use extern "C" in C++?

関連する問題