Makefile筆記

GiraffeCoder發表於2014-04-13

Makefile筆記

這是會是一個持續更新的筆記···

1. 特殊變數$@、$^、$<

$@代表所有的目標檔案,$^表示所有的依賴檔案,$<表示第一個依賴檔案。

在makefile中使用echo命令輸出“$@”時,應使用:\$$@。

e.g:Makefile

all:
	@echo \$$@  = $@
執行make以後輸出:

$@ = all
把上面的特殊變數都放在Makefile中看看,

e.g:Makefile:

all:hello world
	@echo \$$@  = $@
	@echo $$^ = $^
	@echo $$\< = $<
hello:
	
world:
執行make以後輸入如下:

$@ = all
$^ = hello world
$< = hello
其中,@echo $$\< = $< 這條語句可以換成 @echo “$$< = $<” ,其實就是為echo後面的語句加了

雙引號,然後去掉了$符號後面的反斜槓”\“。

2. 和標頭檔案相關的依賴關係的生成

為了讓Makefile支援在修改每個c檔案所包含的標頭檔案之後,會重新編譯生成目標檔案。我們的依賴

關係一般寫成這樣(假如存在main.c,其包含了main.h):

main.o:main.c main.h
這樣寫的應該就不是一個好的程式設計師,因為好程式設計師都很懶。其實應該讓Makefile自動為我們建立

依賴檔案。

先來說一下-MM和-M,這兩個是gcc的選項。假設我當前目錄下有兩個檔案:main.c main.h:

tomato@ubuntu:~/shdir$ ls
main.c  main.h
tomato@ubuntu:~/shdir$ cat main.c
#include <stdio.h>
#include "main.h"

int main(void)
{
    return 0;
}
tomato@ubuntu:~/shdir$ 
先使用-MM這個引數,看看會有什麼情況發生:

tomato@ubuntu:~/shdir$ gcc -MM main.c
main.o: main.c main.h
tomato@ubuntu:~/shdir$ 
很眼熟吧,這樣的依賴關係一目瞭然。

接著使用-M引數:

tomato@ubuntu:~/shdir$ gcc -M main.c
main.o: main.c /usr/include/stdio.h /usr/include/features.h \
 /usr/include/x86_64-linux-gnu/bits/predefs.h \
 /usr/include/x86_64-linux-gnu/sys/cdefs.h \
 /usr/include/x86_64-linux-gnu/bits/wordsize.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
 /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stddef.h \
 /usr/include/x86_64-linux-gnu/bits/types.h \
 /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/libio.h \
 /usr/include/_G_config.h /usr/include/wchar.h \
 /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdarg.h \
 /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
 /usr/include/x86_64-linux-gnu/bits/sys_errlist.h main.h
tomato@ubuntu:~/shdir$ 
列出了一堆的系統標頭檔案,最後還有我們自己新增的main.h。系統檔案一般我們

都不會去修改,所以我們只需要使用-MM這個引數就好了~修改以後的Makeffile如下:

.PHONY: clean

SRCS:=$(wildcard *.c)
OBJS:=$(SRCS:.c=.o)
DEPS:=$(SRCS:.c=.dep)

all:main

-include $(DEPS)

main:$(OBJS)
	gcc -o main $(OBJS)
%.o:%.c
	gcc -c $< -o $@
%.dep:%.c
	@set -e;\
	gcc -E -MM $^ > $@

clean:
	rm *.o *.dep


現在,當你修改了標頭檔案,重新執行make的時候,main檔案會被重新構建~


============================== Sun Apr 13 15:59:51 CST 2014



相關文章