Linux初学対g++,gcc

3091 ワード

vimで簡単なhelloを書き終わった.cppのウィジェット:
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
cout<<"hello,ubunt"<<endl;
return 0;}

gccでcpp-o helloniの時、いつも間違いを報告します:
hello.cpp:(.text+0 x 14):std::coutに対して定義されていない参照hello.cpp:(.text+0 x 19):対‘std::basic_ostream>& std::operator<<(std::basic_ostream>&,char const*)'未定義の参照hello.cpp:(.text+0 x 21):対‘std::basic_ostream>& std::endl(std::basic_ostream>&)'未定義の参照hello.cpp:(.text+0 x 29):std::ostream::operator<(std::ostream&(*)(std::ostream&)』の未定義の参照/tmp/ccIypXVs.o:関数'_static_initialization_and_destruction_0(int,int)’中:hello.cpp:(.text+0 x 51):対‘std::ios_base::Init::Init()'未定義の参照hello.cpp:(.text+0 x 68):対‘std::ios_ベース::Init::~Init()'未定義の参照
端末に戻ると、以前にコンパイルされたコマンドはそうではなく、この世界にはgccだけでなくg++もあることに気づいた.そしてg++hello.cpp-o hellonはやはり、コンパイルはすぐに成功した.
GCC(GNU Compiler Collection、GNUコンパイラ集合)は、GNUが開発したプログラミング言語コンパイラのセットであり、Linux、BSD、Mac OS Xなどの多くのクラスのUnixオペレーティングシステムに標準的なコンパイラとして採用されており、GCCはマイクロソフトのWindowsにも適用されている.もともとC言語しか処理できなかったが、GCCは急速に拡張し、C++を処理できるようになり、その後もFortran、Pascal、Objective-C、Java、Adaと他の言語を処理できるようになった.
g++はlinuxの下のc++のコンパイラで、コンパイル作業を実行するとき、全部で4ステップ必要です.
       1.前処理、生成.iのファイル2.前処理後のファイルをアセンブリ言語に変換する、ファイルを生成する.s         3.アセンブリがターゲットコード(マシンコード)になる生成がある.oのファイル
        4.ターゲットコードを接続し、実行可能プログラムを生成
しかし、上記の過程から、私たちの疑問を解決することはできません.なぜ文章が言及し始めたコンパイルエラーが発生したのでしょうか.もともとgccコマンドはC++プログラムで使用するライブラリに自動的に接続できませんでした.
これに基づいて、リンクは通常g++で完了し、統一のためにLinuxコンパイル/リンクはすべてg++である.
gcc and g++はそれぞれGNUのc&c++コンパイラgcc/g++でコンパイル作業を行うには、合計4ステップ1が必要である.前処理、生成.iのファイル[プリプロセッサcpp]2.前処理後のファイルをアセンブリ言語に変換する、ファイルを生成する.s[コンパイラegcs]3.アセンブリからターゲットコード(マシンコード)に変換する生成する.oのファイル[アセンブリas]4.ターゲットコードを接続し、実行可能プログラム[リンクld]gccとg++の違いを生成するgccとg++はいずれもGNU(組織)の1つのコンパイラである.誤区一:gccはcコードしかコンパイルできません.g++はc++コードしかコンパイルできません.しかし、注意してください.接尾辞は.cの、gccはそれをCプログラムと見なして、g++はc++プログラムと見なします;接尾辞は.cppの場合、両者ともc++プログラムと考えられますが、c++はcのスーパーセットですが、文法に対する要求には違いがあります.C++の文法規則はもっと厳格です.
2.コンパイルフェーズでは、g++はgccを呼び出し、c++コードに対しては両者は等価であるが、gccコマンドはC++プログラムで使用されるライブラリに自動的に接続できないため、通常g++でリンクを完了するが、統一のために、いっそコンパイル/リンクはすべてg++で使用され、cppプログラムはg++しか使用できないような錯覚を与える.誤区二:gccは定義しない_cplusplusマクロ、g++は実際には、コンパイラがコードをCまたはC++の構文で説明することを示すだけで、前述のように接尾辞がcであり、gccコンパイラを用いると、マクロは未定義であり、そうでなければ定義される.誤区三:コンパイルはgccしか使えず、リンクはg++しか使えない.厳密に言えば、この言葉は間違いではないが、概念を混同している.コンパイルはgcc/g++を使うことができ、リンクはg++またはgcc-lstdc++を使うことができる.gccコマンドは、C++プログラムで使用されるライブラリと自動的に結合できないため、通常、g++を使用して結合を完了します.しかし、コンパイル段階では、g++はgccを自動的に呼び出し、両者は等価である.gccとg++の違い私たちはc/c++コードをコンパイルするとき、ある人はgccを使って、ある人はg++を使って、そこでいろいろな言い方が来て、例えばcコードはgccを使って、c++コードはg++を使って、あるいはコンパイルはgccを使って、リンクはg++を使って、しばらくどの言い方が正しいか分かりませんが、もし再びextern“C”に出会ったら、分岐はもっと多くなって、ここで私は結末を作りたいです.結局、知識の目的はもっとはっきりさせることであり、もっと愚かではない.