2

という名前のファイルに保存された、単純で代表的な C プログラムがありますhello.c

#include <stdio.h>
int main(void)
{
    printf('Hello, world\n');
    return 0;
}

Linux マシンで、gcc を使用してプログラムをコンパイルしようとしました。

gcc hello.c

エラーを返します:

undefined reference to "___gxx_personality_v0" ... etc

C++ のコンテキストで前に説明し ように、この問題は、gcc が C ライブラリを C++ プログラムにリンクしようとするリンク段階で発生し、エラーが発生します。回答の1つで、誰かが拡張子重要であり、Cファイルをコンパイルするときにgccに拡張子が必要であり、C++ファイルをコンパイルするときに他の拡張子(たとえば)が必要であると述べました。.c.cpp

質問:私のシステムでは gcc がデフォルトで C++ になっているように見えるので、使用するコンパイラを決定するためにファイル拡張子を使用するように gcc を設定するにはどうすればよいですか? ファイル拡張子だけで言語を指定するだけでは十分ではないようです。-xフラグを使用して言語を指定すると、gcc は期待どおりに機能します。

gcc -x c hello.c
4

1 に答える 1

1

通常、これはユーザーがmake決定します。

GNU Make には、適切なコンパイラを自動的に選択する暗黙の規則が組み込まれています。

次の内容で Makefile を試してください。

all: some_file.o some_other_file.o

そして、同じディレクトリに asome_file.cppとを配置するとsome_other_file.c、gnu make が自動的に正しいコンパイラを選択します。リンカーは、まだ自分で提供する必要がある場合があります。C と C++ を混在させる場合、通常は次のように g++ とリンクするのが最も簡単です。

program.exe: some_file.o some_other_file.o
    g++ -o $@ @^

これは次と同じです。

program.exe: some_file.o some_other_file.o
    g++ -o program.exe some_file.o some_other_file.o
于 2013-02-11T18:29:16.923 に答える