1. 程式人生 > >[Makefile]多目錄Makefile寫法

[Makefile]多目錄Makefile寫法

16px 間隔 ews pro images include 先來 文章 status

最近需要寫一個測試程序,這個測試程序需要集成一些功能,寫在同一個文件看上去很不好,多個文件的Makefile又不是很熟,於是分享下面這篇文章

轉自:http://blog.csdn.net/yuzhihui_no1/article/details/44810357

前面已經分享了單目錄項下多文件的makefile的編寫,現在來看看多目錄下多文件makefile的編寫;

在做項目時,一般文件都會分幾個目錄來存放;基本的是 include/ bin/ src/ obj/ lib/ tools/,這幾個文件;我先說下我的文件存放目錄,用ls -R可以查看到所有文件:./include/common.h ./src/main.c ./src/printStatus.c 就三個文件,其中*.c 文件都依賴於 *.h文件;

同樣的先上第一版makefile:

[cpp] view plain copy
  1. CC=gcc
  2. objects=obj/main.o obj/printStatus.o
  3. bin/main:$(objects)
  4. $(CC) -o bin/main $(objects)
  5. obj/main.o:src/main.c include/common.h
  6. $(CC) -o obj/main.o -c src/main.c -Iinclude
  7. obj/printStatus.o:src/printStatus.c include/common.h
  8. $(CC) -o obj/printStatus.o -c src/printStatus.c -Iinclude
  9. clean:
  10. rm -rf $(objects) bin/main

上面的makefile就是gcc命令的拼湊起來的,下面來分享下比較通用的多目錄下的makefile;

在看多目錄的makefile時,先來理解下幾個函數和變量;

函數:

wildcard 這是擴展通配符函數,功能是展開成一列所有符合由其參數描述的文 件名,文件間以空格間隔;比如:羅列出src下的所有.c文件:$(wildcard ${SRC}/*.c)

patsubst 這是匹配替換函數, patsubst ( 需要匹配的文件樣式,匹配替換成什麽文件,需要匹配的源文件)函數。比如:用src下的*.c替換成對應的 *.o文件存放到obj中:$(patsubst %.c, ${OBJ}/%.o, $(notdir $(SOURCE)))

notdir 這是去除路徑函數,在上面patsubst函數中已經使用過,去除SOURCE中文件的所有目錄,只留下文件名;

變量:

$@:表示目標文件;一般是在規則中這麽用:gcc -o $@ $(object);

$^:表示所有依賴文件;一般是在規則中這麽用:gcc -o $@ $^ ;用所有依賴文件鏈接成目的文件;

$<:表示第一個依賴文件;在規則中使用:gcc -o $@ -c $< ;其實這個時候就是每個依賴文件生成一個目的文件;

第二版makefile

[cpp] view plain copy
  1. #把所有的目錄做成變量,方便修改和移植
  2. BIN = ./bin
  3. SRC = ./src
  4. INC = ./include
  5. OBJ = ./obj
  6. #提前所有源文件(即:*.c文件)和所有中間文件(即:*.o)
  7. SOURCE = $(wildcard ${SRC}/*.c)
  8. OBJECT = $(patsubst %.c,${OBJ}/%.o,$(notdir ${SOURCE}))
  9. #設置最後目標文件
  10. TARGET = main
  11. BIN_TARGET = ${BIN}/${TARGET}
  12. CC = gcc
  13. CFLAGS = -g -Wall -I${INC}
  14. #用所有中間文件生成目的文件,規則中可以用 $^替換掉 ${OBJECT}
  15. ${BIN_TARGET}:${OBJECT}
  16. $(CC) -o $@ ${OBJECT}
  17. #生成各個中間文件
  18. ${OBJ}/%.o:${SRC}/%.c
  19. $(CC) $(CFLAGS) -o $@ -c $<
  20. .PHONY:clean
  21. clean:
  22. find $(OBJ) -name *.o -exec rm -rf {} \; #這個是find命令,不懂的可以查下資料
  23. rm -rf $(BIN_TARGET)

這個makefile的好處就是通用性,裏面不涉及到具體的文件名,當你往src目錄中添加新文件時,可以不需要修改makefile,所以這是個非常好的工具;

轉載請註明作者和原文出處,原文地址:http://blog.csdn.net/yuzhihui_no1/article/details/44810357 若有不正確之處,望大家指正,共同學習!謝謝!!!

前面已經分享了單目錄項下多文件的makefile的編寫,現在來看看多目錄下多文件makefile的編寫;

在做項目時,一般文件都會分幾個目錄來存放;基本的是 include/ bin/ src/ obj/ lib/ tools/,這幾個文件;我先說下我的文件存放目錄,用ls -R可以查看到所有文件:./include/common.h ./src/main.c ./src/printStatus.c 就三個文件,其中*.c 文件都依賴於 *.h文件;

同樣的先上第一版makefile:

[cpp] view plain copy
  1. CC=gcc
  2. objects=obj/main.o obj/printStatus.o
  3. bin/main:$(objects)
  4. $(CC) -o bin/main $(objects)
  5. obj/main.o:src/main.c include/common.h
  6. $(CC) -o obj/main.o -c src/main.c -Iinclude
  7. obj/printStatus.o:src/printStatus.c include/common.h
  8. $(CC) -o obj/printStatus.o -c src/printStatus.c -Iinclude
  9. clean:
  10. rm -rf $(objects) bin/main

上面的makefile就是gcc命令的拼湊起來的,下面來分享下比較通用的多目錄下的makefile;

在看多目錄的makefile時,先來理解下幾個函數和變量;

函數:

wildcard 這是擴展通配符函數,功能是展開成一列所有符合由其參數描述的文 件名,文件間以空格間隔;比如:羅列出src下的所有.c文件:$(wildcard ${SRC}/*.c)

patsubst 這是匹配替換函數, patsubst ( 需要匹配的文件樣式,匹配替換成什麽文件,需要匹配的源文件)函數。比如:用src下的*.c替換成對應的 *.o文件存放到obj中:$(patsubst %.c, ${OBJ}/%.o, $(notdir $(SOURCE)))

notdir 這是去除路徑函數,在上面patsubst函數中已經使用過,去除SOURCE中文件的所有目錄,只留下文件名;

變量:

$@:表示目標文件;一般是在規則中這麽用:gcc -o $@ $(object);

$^:表示所有依賴文件;一般是在規則中這麽用:gcc -o $@ $^ ;用所有依賴文件鏈接成目的文件;

$<:表示第一個依賴文件;在規則中使用:gcc -o $@ -c $< ;其實這個時候就是每個依賴文件生成一個目的文件;

第二版makefile

[cpp] view plain copy
  1. #把所有的目錄做成變量,方便修改和移植
  2. BIN = ./bin
  3. SRC = ./src
  4. INC = ./include
  5. OBJ = ./obj
  6. #提前所有源文件(即:*.c文件)和所有中間文件(即:*.o)
  7. SOURCE = $(wildcard ${SRC}/*.c)
  8. OBJECT = $(patsubst %.c,${OBJ}/%.o,$(notdir ${SOURCE}))
  9. #設置最後目標文件
  10. TARGET = main
  11. BIN_TARGET = ${BIN}/${TARGET}
  12. CC = gcc
  13. CFLAGS = -g -Wall -I${INC}
  14. #用所有中間文件生成目的文件,規則中可以用 $^替換掉 ${OBJECT}
  15. ${BIN_TARGET}:${OBJECT}
  16. $(CC) -o $@ ${OBJECT}
  17. #生成各個中間文件
  18. ${OBJ}/%.o:${SRC}/%.c
  19. $(CC) $(CFLAGS) -o $@ -c $<
  20. .PHONY:clean
  21. clean:
  22. find $(OBJ) -name *.o -exec rm -rf {} \; #這個是find命令,不懂的可以查下資料
  23. rm -rf $(BIN_TARGET)

這個makefile的好處就是通用性,裏面不涉及到具體的文件名,當你往src目錄中添加新文件時,可以不需要修改makefile,所以這是個非常好的工具;

轉載請註明作者和原文出處,原文地址:http://blog.csdn.net/yuzhihui_no1/article/details/44810357 若有不正確之處,望大家指正,共同學習!謝謝!!!

[Makefile]多目錄Makefile寫法