日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 分步编译命令,GCC分步编译C++程序(汇总版)

發布時間:2025/3/15 linux 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++程序(汇总版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。