2009-08-24 5 views
1

g ++でコンパイルされたcとC++ファイルが混在しています。説明されているとおり: What is the difference between g++ and gcc?g ++からgccへの移行

cファイルは、g ++コマンドラインでC++としてコンパイルされています。巨大な問題ではありませんが、gccに移行すると、cファイルをcファイルとしてコンパイルし、C++ファイルをC++としてコンパイルできます。

-Iライブラリには-gが含まれていますか?gccコマンドラインに追加する必要がありますか?g ++コマンドラインにはデフォルトで含まれていますか?

答えて

1

は、には何も追加しないでください。 C++を使用している場合、C++ライブラリが自動的に呼び出されます。

もしそうでなければ、-lstdC++(まだ未定義の参照を取得している場合は、libcの-lc)が必要になります。数学関数を使用する場合は-lmを忘れないでください。

+1

リンカーコマンドに-lstdC++を含める必要がありました。 – simon

4

既に持っているもの以外のインクルードやライブラリを追加する必要はありません。

C++コードから呼び出されているC関数の呼び出し - プログラムが正しくリンクされて動作するように、C++コンパイラにC関数を指示する必要があります。

標準的な方法は、すべてのCヘッダーはC++のファイルに含まれているに次のディレクティブを追加することです。ここ

#ifdef __cplusplus 
extern "C" { 
#endif 

... C header contents go here ... 

#ifdef __cplusplus 
} 
#endif 

さらに詳しい情報:http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

+4

リンカコマンドに-lstdC++を含める必要がありました。 – simon

0

をgccでCオブジェクトをコンパイルしないのはなぜC + +をg ++で使用し、リンクするとg ++を使用してリンクしますか?

+0

私はおそらくできましたが、サードパーティのソースを持つかなり複雑な既存のmakefileを持っていましたが、私はそれを猿にしたくありませんでした。 – simon

1

GCCは、ファイル拡張子に基づいてファイルがどの言語であるかを判断できます。

#include <iostream> 

int main() 
{ 
    std::cout << "Hello world\n"; 
} 

:しかし、GCCは、自動的にあなたの代わりにg++gccを使用してC++プログラムをコンパイルすることができますが、あなたは-lstdc++ディレクティブを追加する必要があります意味実際にはC.以外の言語のために、実行時のサポートにリンクしません。より正確にg++ hello.cc

gcc hello.cc -lstdc++

、あなたはあなたが標準ライブラリ、例外、オペレータnew、またはRTTIを使用している場合-lstdc++を指定する必要があります。例えば、-lstdc++せずに次のようにコンパイルしてみてください。

int main() 
{ 
    try { 
     throw 1; 
    } 
    catch (int i) 
    { 
     return i; 
    } 
} 

std::string Sを含む)STLコンテナはデフォルトでオペレータnewを使用することに注意してください。厳密に言えば、-lstdc++のないアルゴリズム(std::minstd::find_first_ofなど)バインダーなどを標準ライブラリに使用できるはずですが、ほとんどの場合、それを含めることもできます(リンカーは、実際にリンクしていない)。

+0

そのような意味があります。C++標準ライブラリ(std :: cout)を使用しているので、コマンドラインに明示的に含める必要があります。実際の質問は、C++の標準ライブラリを普通の古いC言語で使用している理由です。 –

+0

@Gerco Dries:CとC++はまだint mainを持っています。あなたのコメントで何を言おうとしていますか? –

+0

@Greco、質問の最後の文は "gccコマンドラインに追加する必要があるのは、-iライブラリを含むか、g ++コマンドラインにデフォルトでインクルードするのですか?"ということです。 「私がC++コードを持っていて、GCCでコンパイルしたいのですが、それを動作させるためにはどのスイッチを渡す必要がありますか?つまり、どちらのプログラムスニペットもC++スニペットであり、GCCでコンパイルするにはコマンドラインスイッチ-lstdC++を追加する必要があります。 –

関連する問題