Makefile學習 一 第二版

2021-09-07 05:07:23 字數 3497 閱讀 3336

1)make:利用 make 工具能夠自己主動完畢編譯工作。這些工作包含:假設僅改動了某幾個原始檔,則僅僅又一次編譯這幾個原始檔[make通過比對對應的.c檔案與.o檔案的時間];假設某個標頭檔案被改動了,則又一次編譯全部包含該標頭檔案的原始檔。利用這樣的自己主動編譯可大大簡化開發工作,避免不必要的又一次編譯。

2)mackfile:make工具通過乙個稱為 mackfile 的檔案來完畢並自己主動維護編譯工作。mackfile檔案描寫敘述了整個project的編譯、連線等規則。

target ...: dependencies ...

command ...

說明:1)目標(target):即終於想要產生的檔案。如:可執行檔案,目標檔案或中間檔案等;目標也能夠是要執行的動作,如clean,也稱為偽目標。

2)依賴(dependencies):為了產生目標檔案而依賴的檔案列表,乙個目標通常依賴於多個檔案。

3)命令(command):是make執行的動作(shell命令或是可在shell下執行的程式,如echo)。注意:每乙個命令列的起始字元必須為tab字元!

假設dependencies中有乙個或多個檔案更新的話,command就要執行,這就是makefile最核心的內容.

#1 最簡單

hello:

gcc -o hello hello.c

#2 略微複雜

hello:hello.o

gcc -o hello hello.o

hello.o:

gcc -o hello.o -c hello.c

#3 進一步完好

hello:hello.o

gcc -o hello hello.o

hello.o:

gcc -o hello.o -c hello.c

clean:

rm -rf hello.o  #delete file hello.o

#4 在mackfile中執行shell命令[@符號:不輸出命令本身]

hello:hello.o

gcc -o hello hello.o

@echo "--------------ok------------"

hello.o:

gcc -o hello.o -c hello.c

clean:

rm -rf hello.o  #delete file hello.o

#5 綜合[.phony:#顯示宣告偽目標]

.phony: clean

main: main.o sub.o add.o

gcc -wall -g -o main main.o sub.o add.o

main.o: main.c

gcc -wall -g -o main.o -c main.c

add.o: add.c add.h

gcc -wall -g -o add.o -c add.c

sub.o: sub.c sub.h

gcc -wall -g -o sub.o -c sub.c

clean:

rm -f main.o sub.o add.o

執行:1)make #生成第乙個目標

2)make clean #「生成」clean偽目標

3)make main.o #僅生成main.o目標

4)make -f mackfile #顯示指定執行的檔名稱

為了簡化和維護mackfile,能夠在mackfile中使用變數,格式

varname=some_text

引用變數的值:$(varname)

依照慣例,在mackfile中,變數一般大寫

makefile自己主動化變數

選項名作用

$@規則的目標檔名稱

$<

規則的第乙個依賴檔名稱

$^規則的全部依賴文列表

$*不包含字尾名的當前依賴檔名稱

$?當前目標所依賴的檔案列表中比當前目標檔案還要新的檔案

#綜合演示樣例

.phony: clean

.suffixes: .c .o

.c.o:

gcc -wall -g -o $@ -c $^

objects = main.o sub.o add.o

sources = $(objects:.o=.c)

main: $(objects)

gcc -wall -g -o $@ $^

clean:

@echo "delete execute file and object file..."

rm -f $(objects) main

附-.suffixes:.c .o #表示不論什麼x.c檔案與x.o檔案關聯

#演示樣例-生成多個可執行檔案1

.phony: clean all 

bin = 01test 02test

all: $(bin)

clean:

-rm -f $(bin)

#演示樣例-生成多個可執行檔案2-使用自己定製的規則,生成.o中間檔案

.phony: clean all 

bin = 01test 02test

objects = $(bin:=.o)

all: $(bin)

01test.o: 01test.c

02test.o: 02test.c

clean:

-rm -f $(bin) $(objects)

#演示樣例-生成多個可執行檔案3-使用更加仔細的規則

.phony: clean all 

cflags = -g -wall

cc = gcc 

bin = 01test 02test

objects = $(bin:=.o)

.suffixes: .c .o

.c.o:

$(cc) $(cflags) -c $< -o $@

all: $(bin)

01test.o: 01test.c

02test.o: 02test.c

clean:

-rm -f $(bin) $(objects)

%.o:%.c

.c.o:

#演示樣例

.phony: clean all 

cc = gcc 

cflags = -wall -g

bin = 01test 02test 

sources = $(bin:=.c)

objects = $(bin:=.o)

all: $(bin)

01test: 01test.o

02test: 02test.o

#%.o: %.c #模式規則

#   $(cc) $(cflags) -c $< -o $@

.c.o: #字尾規則,與前作用同樣

$(cc) $(cflags) -c $< -o $@

clean:

-rm -rf $(bin) $(objects) 

gcc學習 二 第二版

1 概要 在使用c語言和其它語言進行程式設計的時候,我們須要標頭檔案來提供對常數的定義和對系統及庫函式呼叫的宣告。庫檔案是一些預先編譯好的函式集合,那些函式都是依照可重用原則編寫的。它們通常由一組互相關聯的用來完畢某項常見工作的函式構成。比方用來處理螢幕顯示情況的函式 ncurses庫 和資料庫訪問...

DBA高階學習計畫第二版

dba高階學習計畫第二版 楊國利簡介 網名 崢狼。qq群 資料庫設計管理群豬,csdn的mssql資料庫基礎版的7月份資料庫專家第80名,即將三個褲衩。一直在csdn中積極為排憂解難。一名為成為oracle的dba而努力的人。2008年7月20號,在china pub上定的兩本書到貨,並著手學習,一...

array c 實現,第二版

include include include include using namespace std namespace mylib array const array coll alloc coll.alloc size coll.size ia null array const pointer...