5

へじ

void hej();

hej.m

void hej(){}

メイン.mm

#import "hej.h"

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

}

これは私に与えます:

「hej()」、参照元: main.o シンボル内の _main が見つかりません

main.mm を main.m (単一の m) に、または hej.m を mm または cpp に名前変更すると、機能します。(ただし、これらの「解決策」はどれも好ましいものではありません。objc++ 環境で c-lib を使用したいと想像してください。lib 全体を変更したくないか、できなかった可能性があり、objc++ で使用する必要があります。 )

ここで何が起こっているのですか?

4

1 に答える 1

17

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

解決するには、main.mm が C++ の名前ではなく C の名前を検索するようにします。hej.h を制御する場合、次のようなものを追加するのが一般的です。これは、hej.h が C または C++ ファイルに含まれている場合に機能します。

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

void hej();

#ifdef __cplusplus
}
#endif

hej.h を所有していない場合は、代わりに main.mm で次を実行できます。

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

int main(int argc, char *argv[])
{
}
于 2009-09-01T14:41:33.587 に答える