Makefile初探2 使用變數

2021-08-21 10:27:57 字數 2279 閱讀 4655

在makefile中的定義的變數,就像是c/c++語言中的巨集一樣,他代表了乙個文字字串,在makefile中執行的時候其會自動原模原樣地展開在所使用的地方。其與c/c++所不同的是,你可以在makefile中改變其值。在makefile中,變數可以使用在「目標」,「依賴目標」,「命令」或是makefile的其它部分中。變數在宣告時需要給予初值,而在使用時,需要給在變數名前加上「$」符號,但最好用小括號「()」或是大括號「{}」把變數給包括起來。如果你要使用真實的「$」字元,那麼你需要用「$$」來表示。

變數可以使用在許多地方,如規則中的「目標」、「依賴」、「命令」以及新的變數中。

讓我們先來看之前寫的乙個串列埠初始化程式的makefile

all:

arm-linux-gcc -c -o start.o start.s

arm-linux-gcc -c -o main.o main.c

arm-linux-gcc -c -o init.o init.c

arm-linux-gcc -c -o serial.o serial.c

arm-linux-ld -ttext 0 start.o main.o init.o serial.o -o led_on.elf

arm-linux-objcopy -o binary -s led_on.elf led_on.bin

clean:

rm *.bin *.o *.elf

使用變數對這個mk進行簡化如下:

cc		= arm-linux-gcc

ld = arm-linux-ld

objcopy = arm-linux-objcopy

objdump = arm-linux-objdump

objs = start.o init.o serial.o main.o

led_on.bin:$(objs)

$(ld) -ttext 0 -o led_on.elf $^

$(objcopy) -o binary -s led_on.elf led_on.bin

%.o : %.s

$(cc) -o $@ $< -c #$(cc)就是變數的引用,可以把$(cc)直接替換成arm-linux-gcc

%.o : %.c

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

clean:

rm *.bin *.o *.elf

為了搞清楚這個makefile檔案,我們先來學習以下的預備知識:

$@:目標的名字

$^:依賴列表的所有檔案的名字

$<:依賴列表的第乙個檔案的名字

例如:

test1.o:test1.c head.c
gcc -o $@ $^
$@就是test1.o

$^就是test1.c head.c

$《就是test1.c 

%是makefile中的萬用字元(和*萬用字元的區別請看博文

接下來我們分析一下這個檔案:

1.led_on.bin:$(objs)這個是第乙個規則,將變數展開也就是led_on.bin:start.o init.o serial.o main.o ,然後會發現缺少依賴檔案。編譯器會尋找有沒有哪一條規則會生成這幾個依賴檔案。

2.尋找start.o的構造規則,看看makefile中那個規則符合。首先找到了%.o : %.s,我們根據萬用字元的規則替換一下就可以得到start.o : start.s,然後資料夾裡面正好能找到start.s,所以根據這個規則就可以生成start.o。

3.尋找init.o的構造規則。我們首先找到的也是%.o : %.s,但是我們壓根就沒有init.s這個檔案,所以這個規則沒有配上。接著找到的是%.o : %.c這個規則,init.o : init.c,同理,我們找到init.c這個檔案。所以,根據這個規則得到了init.o。

4.同理,我們依次得到了生成led_on.bin這個目標的全部依賴(start.o init.o serial.o main.o )

5.接下來就是生成ed_on.bin這個目標了,將變數全部展開。如下

led_on.bin:start.o init.o serial.o main.o 

arm-linux-ld -ttext 0 -o led_on.elf start.o init.o serial.o main.o

arm-linux-objcopy -o binary -s led_on.elf led_on.bin

最終就可以生成我們的終極目標led_on.bin。

makefile中使用變數

makefile裡的變數就像乙個變數,變數的作用主要如下 1 儲存檔名列表。2 儲存編譯器的引數。makefile中的變數是用乙個字串在makefile中定義的,這個文字串就是變數的值。只要在一行的開始寫下這個變數的名字,後面跟乙個 然後跟要設定的這個變數的 值即可定義變數,下面是定義變數的語法 變...

makefile中使用變數

makefile裡的變數就像乙個變數,變數的作用主要如下 1 儲存檔名列表。2 儲存編譯器的引數。makefile中的變數是用乙個字串在makefile中定義的,這個文字串就是變數的值。只要在一行的開始寫下這個變數的名字,後面跟乙個 然後跟要設定的這個變數的 值即可定義變數,下面是定義變數的語法 變...

Makefile工程管理初探

makefile是一種用於工程管理的規則,乙個工程中的原始檔不計其數,如何通過一定的規範來指定哪些原始檔需要編譯,哪些原始檔需要忽略,這一點很重要,makefile提供了一種很好的工程管理的規則來實現對整個專案的編譯和配置,試想而知,當乙個工程包含幾千個原始檔和標頭檔案的時候,你僅僅通過單條的命令乙...