1

C++ プログラムをコンパイルしようとすると、このエラーが発生します。

undefined reference to 'some_function'

一方、メイクファイルに含まれるファイルを追加しますsome_functionsome_functionまた、使用するファイルに宣言を含めます。では、なぜコンパイラはそれを見つけることができないと文句を言うのでしょうか? 考えられる理由は何ですか?

私のメイクファイルはそのようなものです

CXX = g++
CXXFILES = dlmalloc.c pthreads.cpp queue.cpp 

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE
LIBS = -lpthread -ldl

all:
    $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS)

clean:
    rm -f prog *.o

some_functionで定義されdlmalloc.c、内部で使用されpthreads.cppます。dlmalloc.cそれは C ソース コード ファイルであり、その他は C++ ファイルであるという事実と関係がありますか。たぶん、ここでextern "C"キーワードを使用する必要がありsome_functionますよね?

4

1 に答える 1

8

ここで extern "C" キーワードを使用する必要があるのではないでしょうか。

はい。C++ コードから C としてコンパイルされた関数を呼び出したい場合は、それを宣言する必要がありますがextern "C"、C では有効な構文ではないため、C++ でのみ宣言する必要があります。

プリプロセッサ シンボルを使用して__cplusplus、どちらの言語にも有効なヘッダーを作成できます。

#ifdef __cplusplus
extern "C" {
#endif
void some_function();

/* many, many more C declarations */

#ifdef __cplusplus
}
#endif

内部のものextern "C" { ... }はCの宣言として扱われます。C++ では、各関数が常にこのように宣言されていることを確認してください。また、C 関数が実際に C++ で記述されているというまれな可能性があります (強くお勧めしません)。宣言は、関数の実際の定義の前に来る必要があります。

于 2012-07-03T17:29:40.797 に答える