天天看點

【Linux】一步一步學Linux——gcc指令(249)

00. 目錄

文章目錄

​​00. 目錄​​​​01. 指令概述​​​​02. 指令格式​​​​03. 常用選項​​​​04. 參考示例​​​​05. 附錄​​

01. 指令概述

​gcc指令​使用GNU推出的基于C/C++的編譯器,是開放源代碼領域應用最廣泛的編譯器,具有功能強大,編譯代碼支援性能優化等特點。

gcc是GNU編譯器套件(GNU Compiler Collection),它包括了​​C​​​、​​C++​​​、​​Objective-C​​​、​​Fortran​​​、​​Java​​​、​​Ada​​​、​​Go語言​​​和​​D語言​​​的前端,也包括了這些語言的庫(如libstdc++、libgcj等等)。GCC的初衷是為GNU作業系統專門編寫的一款編譯器。GNU系統是徹底的​​自由軟體​​。此處,“自由”的含義是它尊重使用者的自由。

02. 指令格式

用法:gcc [選項] 檔案...      

03. 常用選項

-pass-exit-codes         在某一階段退出時傳回最高的錯誤碼
  --help                   顯示此幫助說明
  --target-help            顯示目标機器特定的指令行選項
  --help={common|optimizers|params|target|warnings|[^]
  {joined|separate|undocumented}}[,...]
                           顯示特定類型的指令行選項
  (使用‘-v --help’顯示子程序的指令行參數)
  --version                顯示編譯器版本資訊
  -dumpspecs               顯示所有内建 spec 字元串
  -dumpversion             顯示編譯器的版本号
  -dumpmachine             顯示編譯器的目标處理器
  -print-search-dirs       顯示編譯器的搜尋路徑
  -print-libgcc-file-name  顯示編譯器伴随庫的名稱
  -print-file-name=<庫>    顯示 <庫> 的完整路徑
  -print-prog-name=<程式>  顯示編譯器元件 <程式> 的完整路徑
  -print-multiarch         Display the target's normalized GNU triplet, used as
                           a component in the library path
  -print-multi-directory   顯示不同版本 libgcc 的根目錄
  -print-multi-lib         顯示指令行選項和多個版本庫搜尋路徑間的映射
  -print-multi-os-directory 顯示作業系統庫的相對路徑
  -print-sysroot           顯示目标庫目錄
  -print-sysroot-headers-suffix 顯示用于尋找頭檔案的 sysroot 字尾
  -Wa,<選項>               将逗号分隔的 <選項> 傳遞給彙編器
  -Wp,<選項>               将逗号分隔的 <選項> 傳遞給預處理器
  -Wl,<選項>               将逗号分隔的 <選項> 傳遞給連結器
  -Xassembler <參數>       将 <參數> 傳遞給彙編器
  -Xpreprocessor <參數>    将 <參數> 傳遞給預處理器
  -Xlinker <參數>          将 <參數> 傳遞給連結器
  -save-temps              不删除中間檔案
  -save-temps=<arg>        不删除中間檔案
  -no-canonical-prefixes   生成其他 gcc 元件的相對路徑時不生成規範化的
                           字首
  -pipe                    使用管道代替臨時檔案
  -time                    為每個子程序計時
  -specs=<檔案>            用 <檔案> 的内容覆寫内建的 specs 檔案
  -std=<标準>              指定輸入源檔案遵循的标準
  --sysroot=<目錄>         将 <目錄> 作為頭檔案和庫檔案的根目錄
  -B <目錄>                将 <目錄> 添加到編譯器的搜尋路徑中
  -v                       顯示編譯器調用的程式
  -###                     與 -v 類似,但選項被引号包覆,并且不執行指令
  -E                       僅作預處理,不進行編譯、彙編和連結
  -S                       編譯到彙編語言,不進行彙編和連結
  -c                       編譯、彙編到目标代碼,不進行連結
  -o <檔案>                輸出到 <檔案>
  -pie                     Create a position independent executable
  -shared                  Create a shared library
  -x <語言>                指定其後輸入檔案的語言
                           允許的語言包括:c c++ assembler none
                           ‘none’意味着恢複預設行為,即根據檔案的擴充名猜測
                           源檔案的語言      

04. 參考示例

​4.1 生成預設的可執行檔案​

[deng@localhost bak]$ gcc test.c 
[deng@localhost bak]$      

将test.c預處理、彙編、編譯并連結形成可執行檔案。這裡未指定輸出檔案,預設輸出為a.out。

​4.2 指定輸出檔案​

[deng@localhost bak]$ gcc test.c -o test
[deng@localhost bak]$ ls
5th  6th  7th  8th  9th  test  test.c
[deng@localhost bak]$      

将test.c預處理、彙編、編譯并連結形成可執行檔案test。-o選項用來指定輸出檔案的檔案名。

​4.3 僅作預處理,不進行編譯、彙編和連結​

[deng@localhost bak]$ gcc -E test.c -o test.i 
[deng@localhost bak]$      

将test.c預處理輸出test.i檔案。

​4.4 編譯到彙編語言,不進行彙編和連結​

[deng@localhost bak]$ gcc -S test.c -o test.s
[deng@localhost bak]$ ls
5th  6th  7th  8th  9th  test  test.c  test.i  test.s
[deng@localhost bak]$      

将預處理輸出檔案test.i彙編成test.s檔案。

​4.5 編譯、彙編到目标代碼,不進行連結​

[deng@localhost bak]$ gcc -c test.c -o test.o
[deng@localhost bak]$ ls
5th  6th  7th  8th  9th  test  test.c  test.i  test.o  test.s
[deng@localhost bak]$      

​4.6 将目标代碼生成可執行檔案​

[deng@localhost bak]$ gcc test.o  -o test
[deng@localhost bak]$      

将編譯輸出檔案test.o連結成最終可執行檔案test。

​4.7 編譯時指定優化級别​

[deng@localhost bak]$ gcc -O1 test.c -o test
[deng@localhost bak]$      

使用編譯優化級别1編譯程式。級别為1~3,級别越大優化效果越好,但編譯時間越長。

​4.8 多檔案編譯​

[deng@localhost bak]$ gcc testfun.c test.c -o test
[deng@localhost bak]$      

将testfun.c和test.c分别編譯後連結成test可執行檔案。

​4.9 多檔案編譯方法二​

[deng@localhost bak]$ gcc -c test.c    
[deng@localhost bak]$ gcc -c testfun.c   
[deng@localhost bak]$ gcc test.o testfun.o -o test
[deng@localhost bak]$      

05. 附錄