linux 分步编译命令,GCC分步编译C++程序(汇总版)
通過(guò)前面幾節(jié)的講解,已經(jīng)就 gcc(g++)指令可用的 -E、-S、-c 以及 -o 選項(xiàng)的功能和用法做了詳細(xì)的講解。在此基礎(chǔ)上,本節(jié)將對(duì)“如何分步編譯C/C++程序”這個(gè)問(wèn)題做一個(gè)完整的解答。
接下來(lái),我將以 g++ 指令分別對(duì) C++ 源程序做預(yù)處理、編譯、匯編和鏈接操作為例,完整地給讀者演示如何分步編譯源代碼程序。樣例程序如下:
//位于 demo.cpp 文件中
#include
using namespace std;
int main(){
cout << "GCC教程:http://c.biancheng.net/gcc/" << endl;
return 0;
}
GCC分步編譯C++源程序
1) 預(yù)處理
通過(guò)給 g++ 指令添加 -E 選項(xiàng),即可輕松實(shí)現(xiàn)令 GCC 編譯器只對(duì)目標(biāo)源程序進(jìn)行預(yù)處理操作。比如:
[root@bogon demo]# g++ -E demo.cpp -o demo.i
[root@bogon demo]# ls
demo.cpp? demo.i
注意,由于編譯階段需要用到預(yù)處理的結(jié)果,因此這里必須使用 -o 選項(xiàng)將該結(jié)果輸出到指定的 demo.i 文件中(Linux 系統(tǒng)中,通常用 ".i" 或者 ".ii" 作為 C++ 程序預(yù)處理后所得文件的后綴名)。
感興趣的讀者可自行運(yùn)行 cat demo.i 指令查看 demo.i 文件中的內(nèi)容。
2) 編譯
值得一提的是,編譯階段針對(duì)的將不再是 demo.cpp 源文件,而是 demo.i 預(yù)處理文件。對(duì)預(yù)處理文件進(jìn)行編譯操作,實(shí)際上就是對(duì) demo.i 文件做進(jìn)一步的語(yǔ)法分析,并生成對(duì)應(yīng)的匯編代碼文件(Linux 發(fā)行版通常以 ".s" 作為其后綴名)。
通過(guò)給 g++ 指令添加 -S 選項(xiàng),即可令 GCC 編譯器僅對(duì)指定預(yù)處理文件做編譯操作。例如:
[root@bogon demo]# g++ -S demo.i
[root@bogon demo]# ls
demo.cpp? demo.i? demo.s
和預(yù)處理階段不同,即便這里不使用 -o 選項(xiàng),編譯結(jié)果也會(huì)輸出到和預(yù)處理文件同名(后綴名改為 .s)的新建文件中。
3) 匯編
匯編階段就是將之前生成的匯編代碼文件(demo.s)做進(jìn)一步轉(zhuǎn)換,生成對(duì)應(yīng)的機(jī)器指令。通過(guò)給 g++ 指令添加 -c 選項(xiàng),即可令 GCC 編譯器僅對(duì)指定的匯編代碼文件做匯編操作。
例如:
[root@bogon demo]# g++ -c demo.s
[root@bogon demo]# ls
demo.cpp? demo.i? demo.o? demo.s
顯然,默認(rèn)情況下匯編操作會(huì)自動(dòng)生成一個(gè)和匯編代碼文件名稱(chēng)相同、后綴名為 .o 的二進(jìn)制文件(又稱(chēng)為目標(biāo)文件)。
4) 鏈接
目標(biāo)文件已經(jīng)是二進(jìn)制文件,與可執(zhí)行文件的組織形式類(lèi)似,只是有些函數(shù)和全局變量的地址還未找到,因此還無(wú)法執(zhí)行。鏈接的作用就是找到這些目標(biāo)地址,將所有的目標(biāo)文件組織成一個(gè)可以執(zhí)行的二進(jìn)制文件。
完成鏈接操作,并不需要給 g++ 添加任何選項(xiàng),只要將匯編階段得到的 demo.o 作為參數(shù)傳遞給它,g++就會(huì)在其基礎(chǔ)上完成鏈接操作。例如:
[root@bogon demo]# g++ demo.o
[root@bogon demo]# ls
a.out? demo.cpp? demo.i? demo.o? demo.s
在鏈接階段,如果不使用 -o 選項(xiàng)將執(zhí)行結(jié)果輸出到指定文件,則 g++ 會(huì)默認(rèn)創(chuàng)建一個(gè)名為 a.out 的可執(zhí)行文件,并將執(zhí)行結(jié)果輸出到該文件中。
經(jīng)過(guò)以上 4 步,最終生成了 a.out 可執(zhí)行文件,我們可以嘗試運(yùn)行該文件,查看其結(jié)果是否正確:
[root@bogon demo]# ./a.out
GCC教程:http://c.biancheng.net/gcc/
顯然,該結(jié)果和我們的預(yù)期相符。
除此之外,如果讀者不想執(zhí)行這么多條指令,但想獲得預(yù)處理、編譯、匯編以及鏈接這 4 個(gè)過(guò)程產(chǎn)生的中間文件,可以執(zhí)行如下指令:
[root@bogon demo]# g++ demo.cpp -save-temps
[root@bogon demo]# ls
a.out? demo.c? demo.cpp? demo.ii? demo.o? demo.s
可以看到,通過(guò)給 g++ 添加 -save-temps 選項(xiàng),可以使 GCC 編譯器保留編譯源文件過(guò)程中產(chǎn)生的所有中間文件。
總結(jié)
以上是生活随笔為你收集整理的linux 分步编译命令,GCC分步编译C++程序(汇总版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: php 数组元素往后移动,php 二维数
 - 下一篇: mysql 判断等于空字符串_mysql