看了一段時間的《程式設計師自我修養》了,也算對程式的編譯,鏈結,裝載的原理有了初步的了解。十分慚愧的是,今天想自己寫乙個簡單的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...