GCC的學習(一)GCC簡介及其常用選項

2021-09-27 06:47:22 字數 3349 閱讀 3151

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的位置...