天天看點

makefile淺析(二)Makefile變量

本文銜接上文部分代碼。

GNU的Make工具除了提供建立目标的基本功能之外,還有許多其他功能,其中之一就是變量或者宏的定義能力。

program:main.o add.o dec.o div.o mul.o

       gcc  main.o add.o dec.o div.o mul.o -o program

字元串“main.o add.o dec.o div.o mul.o”被調用了兩次,當出現大量程式更改極為不友善。于是這裡出現了可以定義變量用來代替大量出現的.o檔案名稱。

在Makefile檔案中可以這樣定義:

objects=main.o add.o dec.o div.o mul.o

将代碼更改為:

#makefile

objects = main.omain.o add.o dec.o mul.o div.o

program: $(objects)

        gcc $(objects) -o program

main.o:main.c main.h

        gcc -c main.c -o main.o

add.o:add.c

        gcc -c add.c -o add.o

dec.o:dec.c

        gcc -c dec.c -o dec.o

mul.o:mul.c

        gcc -c mul.c -o mul.o

div.o:div.c

        gcc -c div.c -o div.o

clean:

        rm *.o program

效果圖:

之後如果有新的.o檔案加入,隻需要修改objects變量即可。

在Makefile中定義變量中有兩種形式,一種是遞歸展開方式,另一種是簡單方式。

Make中變量格式是:$(VAR)

Makefile中變量分為使用者自定義變量,預定義變量,自動變量及環境變量。如objects是使用者自定義變量,關于其他三個變量在網上都可以查到,在此不多贅述。

自動變量中:

$^    所有不重複的依賴檔案,都以空格分開

$@  目标檔案的完整名稱

我編寫一個makefile檔案,在檔案中引入預定義變量“CC”和“CFLAGS”,自動變量“$^”和“$@”。對于初學者很難,熟練掌握之後,就會發現這樣增加了makefile編寫靈活度。

objects = main.omain.o add.o dec.o mul.o div.o

program: $(objects)

CC=gcc

CFLAGS=-Wall -O -g

        $(CC) $(CFLAG) -o $@

main.o:main.c main.h

         $(CC) $(CFLAG) -c main.c -o main.o

add.o:add.c

        $(CC) $(CFLAG) -c add.c -o add.o

dec.o:dec.c

        $(CC) $(CFLAG) -c dec.c -o dec.o

mul.o:mul.c

        $(CC) $(CFLAG) -c mul.c -o mul.o

div.o:div.c