4

Linuxを使用していて、次のファイルがあります。

main.c, main.h
fileA.c, fileA.h
fileB.cpp, fileB.h

関数F1()はで宣言されfileB.h、で定義されていfileB.cppます。で関数を使用する必要があるため、関数をfileA.c次のように宣言しました

extern void F1();

fileA.c

ただし、コンパイル中にエラーが発生しました

fileA.c: (.text+0x2b7): undefined reference to `F1'

なにが問題ですか?

ありがとうございました。

ETA:受け取った回答のおかげで、次のようになりました。

fileA.hには、

#include fileB.h
#include main.h

#ifdef __cplusplus
extern "C" 
#endif
void F1();

fileA.cには、

#include fileA.h

fileB.hには、

extern "C" void F1();

fileB.cppには、

#include "fileB.h"

extern "C" void F1()
{ }

しかし、私は今エラーがあります

fileB.h: error: expected identifier or '(' before string constant
4

5 に答える 5

17

fileA.c実際にC++ではなくCとしてコンパイルしている場合は、関数に適切なC互換のリンケージがあることを確認する必要があります。

externこれは、キーワードの特殊なケースで行うことができます。宣言と定義の両方で:

extern "C" void F1();
extern "C" void F1() {}

それ以外の場合、Cリンカは、実際にはいくつかのマングルされたC ++名と、サポートされていない呼び出し規約でのみ存在する関数を探します。:)

残念ながら、これはC ++で行う必要があることですが、構文はCでは無効ですexternC++コードにのみ表示されるようにする必要があります。

したがって、プリプロセッサの魔法を使って:

#ifdef __cplusplus
extern "C"
#endif
void F1();

完全にきれいというわけではありませんが、2つの言語のコード間でヘッダーを共有するために支払う価格です。

于 2011-06-21T09:56:29.317 に答える
5

適切なを与えるために必要なcソースコードからc++関数を呼び出せるようにするためlinkage specification

リンケージ仕様を指定するためのフォーマットは次のとおりです。

extern "type_of_Linkage" <function_name>

したがって、あなたの場合は、以下を使用する必要があります。

extern "C" void F1();
于 2011-06-21T09:53:26.400 に答える
4

おそらく、使用

extern "C" void F1();
于 2011-06-21T09:49:30.813 に答える
2

Cコンパイラはextern"C"の意味を認識していないため、fileA.cにfileB.hを(fileA.h経由で)含めることはできません。そのため、文字列の前に識別子が表示されると文句を言います。fileB.hをfileA.cまたはfileA.hに含めようとしないでください。その必要はありません

于 2011-06-21T23:41:24.607 に答える
-1

fileA.cにはfileA.hも含める必要があると思います。

于 2011-06-21T09:48:48.223 に答える