對於C++/C語言的初學者來說,了解它們的編譯連接過程以及這個過程常用的工具,是一個很好的開始。
從代碼源文件到機器可執行的二進制代碼(Windows上為exe文件,Unix系列沒有約定的後綴,但可通過shell直接調用),一個C++/C文件經歷了編譯和連接兩個過程。編譯過程將源代碼轉換成匯編語言或者機器語言。由於C++/C使用的是分段編譯,即單個文件單獨編譯成中間代碼,編譯之後就必須把這些中間代碼以及這些代碼引用的庫文件,連接起來,才能形成可執行文件。
Gnu的gcc全稱Gnu Compiler Collection,是當下比較流行的C++/C的編譯連接器。gcc原名為Gnu C語言編譯器,後來很快擴展成一個編譯器套件,包含C,C++,Java等語言的編譯器。另外,Gnu組織又為C++語言單獨發布了一個編譯器,名為g++。通過執行gcc --help和g++ --help,你會發現,兩者的命令行參數幾乎是一樣的。由於gcc支持多語言編譯,如果不指名源文件的類型,gcc編譯的時候,會試圖通過文件名後綴來選擇相應的編譯器。其中.c默認C編譯器,.cpp默認C++編譯器。
g++/gcc都支持將編譯連接過程合二為一。即通過g++ <源文件1> <源文件2> ... <源文件n> -o 目標文件或者gcc <源文件1> <源文件2> ... <源文件n> -o 目標文件的形式,直接生成可執行的目標文件。如果不通過-o選項指定目標文件的名字,默認目標文件在Windows上為a.exe,在Linux上為a.out。
下圖為Linux機器上gcc --help的輸出。
其中-c選項告訴編譯器只編譯和匯編,但不連接。-s選項告訴編譯器生成匯編代碼。-x選項可指定源文件類型,c,c++或者其他。