2009-09-01 12 views
5

hej.hのObjective-C++シンボルが見つからない奇妙

void hej(); 

hej.m

void hej(){} 

main.mm

#import "hej.h" 

int main(int argc, char *argv[]) 
{ 

} 

これは私与える:

「HEJを() "、参照先: _main in main.o シンボルが見つかりません

main.mmの名前をmain.m(single m)に変更するか、hej.mをmmまたはcppに変更します。 (これらの「解決法」のどれも望ましいわけではありませんが、objC++環境でc-libを使いたいと思っているとしましょう。あなたはlib全体を変更したくないかもしれませんし、objC++でも使う必要があります。 )

ここでは正確に何が起こっていますか?

+0

Objective-C++は、C++とObjective-Cの構文を組み合わせたソースファイルをコンパイルできるGNU Compiler Collectionのフロントエンドですか? –

答えて

17

Cファイル(*.c, *.m)でコンパイルすると、void hej()という宣言は、_hejというC関数へのリンカー参照を生成します。 C++ファイル(*.cc, *.mm,など)でコンパイルすると、宣言は、引数の説明を含むC++の「mangled name」へのリンカー参照を生成します。 (これは、例えば、void hej(int)void hej(char*)から区別するために、関数のオーバーロードをサポートするために行われます。 hej.mは常にCの名前を作成します。 main.mmがC++名を参照するとき、それは見つからないでしょう。

解決するには、main.mmがC++ではなくCの名前を探していることを確認してください。

/* hej.h */ 
#ifdef __cplusplus 
extern "C" { 
#endif 

void hej(); 

#ifdef __cplusplus 
} 
#endif 

あなたは自分のhej.hをしない場合、:あなたはhej.hをコントロールしている場合hej.hは、CまたはC++ファイルのいずれかに含まれている場合、それは動作思われる、次のようなものを追加することが一般的です

extern "C" { 
#import "hej.h" 
} 

int main(int argc, char *argv[]) 
{ 
} 
関連する問題