gcc(the gnu compiler collection)gcc是gnu編譯器集合,它包括了c/c++、objective-c、fortran、ada和go語言的前端和對應的庫(libstdc++)gcc初衷是為完全免費的gnu系統編寫的編譯器。
乙個c程式從編輯到執行需要經過以下過程:
編寫並儲存程式(.c)->預處理(.c)成檔案(.i)->彙編(.i)檔案成(.s)->編譯(.s)成(.o)->鏈結(.o/.so )成可執行->載入可執行檔案並進行庫的動態鏈結->記憶體中的程式->cpu執行
假如我編輯並儲存了如下程式
#include
using namespace std;
#define aaa 33333
intmain()
2.1 預處理 -e(pre-pocessing)***.c->***.i
預處理會做三件事情,為編譯做準備:
這個-o
其實指定生成檔案名字標識(不指定預設生成a.out
)
這一階段生成的檔案(***.i),還是可以很容易閱讀:
//...標頭檔案展開部分
using namespace std;
intmain()
2.2 編譯 -s(compiling) ***.i->***.s
.file "class0919.cpp"
.text
.section .rodata
.type _zstl19piecewise_construct, @object
.size _zstl19piecewise_construct, 1
_zstl19piecewise_construct:
.zero 1
.local _zstl8__ioinit
.comm _zstl8__ioinit,1,1
.text
.globl main
.type main, @function
main:
.lfb1493:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $80, %rsp
//... 省略了一大段組合語言
.lc1:
.long 1717986918
.long 1078240870
.hidden __dso_handle
.ident "gcc: (ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"
.section .note.gnu-stack,"",@progbits
2.3 彙編 -c(assembling) ***.s->***.o
彙編檔案匯編後的檔案型別是乙個二進位制檔案,編譯過程中叫做目標檔案,基本上人是沒法讀懂了:
亂碼
2.4 鏈結(linking) ***.o->***
對目標檔案的集合稱為可執行檔案。命令g++ ***1.o ***2.o
g++ -o eee
內容一樣是亂碼,使用file命令可以檢視其型別:
eee: elf 64-bit lsb shared object, x86-64, version 1 (sysv), dynamically linked, interpreter /lib64/l, for gnu/linux 3.2.0, buildid[sha1]=06ad229f773d4211a1a47719e43e93cc2886c5c3, not stripped
可以它是乙個可執行程式。
gcc不僅具有編譯成可執行的功能,還具有新增有用資訊(-g)和列印資訊(除錯),甚至還可以調節優化等級(-on)。
option
meaning
-o指定生成的檔名
-e僅執行編譯預處理
-s將c**轉換為彙編**
-wall
顯示警告資訊
-c僅執行編譯操作,不進行連線操作
-g生成除錯資訊,不加選項不能進行gdb除錯
檢視gcc版本:
gcc --version
gcc -v
3.1 無選項編譯
無選項編譯直接生成名為a.out
的可執行檔案
gcc test.c
將test.c預處理、彙編、編譯並鏈結成可執行檔案a.out
。
3.2 選項 -o
gcc test.c -o test
#省略了-c選項,完整的gcc -c test.c -o test,不會產生中間檔案
和無選項編譯一樣,只不過生成的可執行名字變成了test
。
3.3 選項 -e
僅預處理:
gcc -e test.c -o test.i
將test.c預處理輸出test.i檔案。
3.4 選項 -c
僅編譯:
gcc -c test.s
將彙編輸出檔案test.s編譯輸出test.o檔案。
3.5 選項 -s
僅彙編:
gcc -s test.i
將預處理輸出檔案test.i彙編成test.s檔案。
3.6 選項-o
優化選項:
gcc -o1 test.c -o test
使用編譯優化級別1編譯程式。級別為1~3,級別越大優化效果越好,但編譯時間越長
3.8 多個檔案一起編譯
第一次生成可以使用:
gcc testfun.c test.c -o test
一起編譯+鏈結生成test可執行
僅對部分原始檔進行了修改,使用-o選項更快:
gcc -c testfun.c #將testfun.c編譯成testfun.o
gcc -c test.c #將test.c編譯成test.o
gcc -o testfun.o test.o -o test
#將testfun.o和test.o鏈結成test
gcc學習系列之一
寫這系列文章是以為我要看看gcc的原始碼,但是還有很多問題,如 yacc的使用,等。希望對此有興趣的同道中人多多指教。gcc是目前使用最廣泛的免費的編譯器之一,最近想看看gcc的原始碼,學習一下編譯的技術。也希望對此有興趣的同道中人能多多指教。要學習乙個軟體的源 最好是首先學習一下這個軟體的使用,所...
linux學習筆記一(gcc)
1 gcc gcc e 預處理 test.c o test.i m32 32位機器 define include gcc s 編譯 s gcc c 彙編 o o檔案 可重定位的目標檔案 鏈結 readelf 檢視elf檔案 h檢視檔案的頭 test.o a列出所有資訊 gcc test.c wall...
GCC的用法 一
gnu gnu is not unix gcc gnu compiler collection 檢視版本命令 gcc v 假設有乙個hello.c檔案 gcc hello.c 產生乙個名為a.out可執行檔案 gcc hello.c o hello 產生乙個名為hello的可執行檔案,注意 o的位置...