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