gcc編譯過程 Makefile反思

2021-05-26 01:45:30 字數 1173 閱讀 5995

看了一段時間的《程式設計師自我修養》了,也算對程式的編譯,鏈結,裝載的原理有了初步的了解。十分慚愧的是,今天想自己寫乙個簡單的makefile,竟然很模糊,無法十分自如的寫出(平時都用乙個已經寫好的樣板改),這裡做乙個反思。

假設有a.c檔案,要把它編譯成可執行檔案a。

編譯+彙編:

試了一下,以下三種寫法都行:

gcc -c a.c -o a.o

gcc -c -o a.o a.c

gcc -c a.c

以上三種寫法都會生成目標檔案a.o。

為了讓gcc在編譯時產生除錯資訊,通常我們加上-g -o -wall的編譯選項

試了一下,以下兩種寫法都行:

gcc -o a a.o

gcc a.o -o a

以上兩種寫法都會產生可執行檔案a

也可以直接用gcc -o a a.c一步完成編譯和鏈結過程。

總結:在以上編譯命令中,-o後面一定要接產生的目標。其他的順序就可以隨意。

再順便複習一下簡單makefile的寫法。

1、makefile中變數的使用,如需定義target變數

target = a

當需要引用target變數時,使用$(target)

2、自動變數的使用,主要是以下三個:

$@: 表示規則中的目標檔案集。

$<: 依賴目標中的第乙個目標名字。

$^: 所有依賴目標的集合。

3、模式規則%的使用

%.c表示所有以.c結尾的檔案,%.o表示所有以.o結尾的檔案。

4、wildcard關鍵字和patsubst關鍵字的使用

如果要取乙個特定的集合,可以用wildcard,如

source_files = $(wildcard *.c)表示讓source_files的值是所有.c檔案的集合

如果要替換乙個集合中某些部分為其他的東西,則可用patsubst,它是乙個模式字串替換函式

如,objs = $(patsubst %.c,%.o,$(source_files))表示把source_files中的所有.c檔案都替換成.o檔案。

5、偽目標的使用

最典型的就是make clean的使用,寫法如下:

.phony:clean:

clean:

rm -rf a a.o

以下是乙個簡單的常用makefile模板:

gcc編譯過程

本文對gcc編譯器如何工作做乙個概要描述.更為詳細的資訊請參考編譯器手冊。當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。...

gcc編譯過程

當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。gcc將c檔案編譯成彙編檔案。3 彙編。as將彙編檔案編譯成機器碼。4 連...

GCC編譯過程

第一步 預處理後結束 引數 e gcc e hello.c o hello.i 檢視hello.i檔案中的內容 cat hello.i stdio.h的內容插入到檔案裡去了,巨集定義也在預處理中都做了相應的處理 第二步 將hello.i 編譯為 目標 引數 c gcc c hello.i o hel...