天天看點

makefile多目錄的.c 格式.cpp混合編譯

1. #
2. # c.cpp混合編譯的makefile模闆
3. #
4. #
5.   
6.   
7. BIN = test.exe  
8. CC = gcc  
9. CPP = g++  
10. #這裡隻加入庫頭檔案路徑及庫路徑
11. INCS = -I"c:/mingw/include"
12. LIBS = -L"c:/mingw/lib"
13. SUBDIRS =  
14. #生成依賴資訊時的搜尋目錄,比如到下列目錄中搜尋一個依賴檔案(比如.h檔案),例如 -I"./***/" -I"./base/"
15. DEFINC =  
16. #給INCS加上依賴搜尋路徑,分開寫可能會産生不一緻情況,而且繁瑣
17. INCS += $(DEFINC)  
18. #
19. #
20. #maintest.c tree/rbtree.c  多了子目錄,那就直接添加 目錄/*.c即可   所有的源檔案--  .c檔案清單
21. CSRCS = $(wildcard ./*.c)  
22. CPPSRCS = $(wildcard ./*.cpp)  
23. #SRCS += $(wildcard ./../base/*.c)
24. #SRCS += $(wildcard ./*.c ./src/*.c ./src/base/*.c ./src/base/tree/*.c ./src/mem/*.c)
25.   
26. #
27. #
28. #所有的.o檔案清單
29. COBJS := $(CSRCS:.c=.o)  
30. CPPOBJS := $(CPPSRCS:.cpp=.o)  
31. #
32. #生成依賴資訊 -MM是隻生成自己的頭檔案資訊,-M 包含了标準庫頭檔案資訊。
33. #-MT 或 -MQ都可以改變生成的依賴  xxx.o:src/xxx.h 為 src/xxx.o:src/xxx.h 當然。前面的 src/xxx.o需自己指定
34. #格式為 -MM 輸入.c或.cpp  查找依賴路徑  -MT或-MQ  生成規則,比如src/xxx.o
35. MAKEDEPEND = gcc -MM -MT  
36. CFLAGS += $(INCS)  
37. CFLAGS += -O2 -Wall -fomit-frame-pointer -g -ansi  
38. CPPFLAGS += $(INCS)  
39. CPPFLAGS += -O2 -Wall -g  
40. #-g 生成調試資訊
41. #-pedantic參數與-ansi一起使用 會自動拒絕編譯非ANSI程式
42. #-fomit-frame-pointer 去除函數架構
43. #-Wmissing-prototypes -Wstrict-prototypes 檢查函數原型
44. #針對每個.c檔案的.d依賴檔案清單
45. CDEF = $(CSRCS:.c=.d)  
46. CPPDEF = $(CPPSRCS:.cpp=.d)  
47.   
48. all:$(BIN)  
49.   
50. #生成.o的對自己目錄中.h .c的依賴資訊.d檔案到.c所在的路徑中
51. #$(DEF)檔案是.d檔案名清單(含目錄),比如tree.d 比對成功那麼%就是tree,然後在嘗試%.c,如果成功。則執行規則
52. # $(<:.c=.o)是擷取此.c檔案的名字(含路徑),然後變為.o比如 src/xxx.o。 以形成如下
53. # src/xxx.o : src/xxx.c ***.h  ***.h  最前面!!注意。  
54. # 此做法是每個.d都和生成他的.c在一個目錄裡,是以需要這樣做。
55. # $(<:.c=.o)之類的 。此時的<相當于變量$< 。切記
56. # : : :  含義同下
57. $(CDEF) : %.d : %.c  
58.     $(MAKEDEPEND) $(<:.c=.o) $< $(DEFINC) > $@  
59. $(CPPDEF) : %.d : %.cpp  
60.     $(MAKEDEPEND) $(<:.cpp=.o) $< $(DEFINC) > $@  
61.   
62. #先删除依賴資訊
63. #重新生成依賴資訊
64. #這裡出現了一個 $(MAKE) 沒有定義的變量。這個變量是由 Make 自己定義的,它的值即為自己的位置,友善 Make 遞歸調用自己。
65. depend:  
66.     rm $(CDEF)  
67.     rm $(CPPDEF)  
68.     $(MAKE) $(CDEF)  
69.     $(MAKE) $(CPPDEF)  
70.   
71. #$(OBJS):%.o :%.c  先用$(OBJS)中的一項,比如foo.o: %.o : %.c  含義為:試着用%.o比對foo.o。如果成功%就等于foo。如果不成功,
72. # Make就會警告,然後。給foo.o添加依賴檔案foo.c(用foo替換了%.c裡的%)
73. # 也可以不要下面的這個生成規則,因為下面的 include $(DEF)  就隐含了。此處為了明了,易懂。故留着
74. $(COBJS) : %.o: %.c  
75.     $(CC) -c $< -o $@ $(CFLAGS)  
76. $(CPPOBJS) : %.o: %.cpp  
77.     $(CPP) -c $< -o $@ $(CPPFLAGS)  
78.   
79. # $@--目标檔案,$^--所有的依賴檔案,$<--第一個依賴檔案。每次$< $@ 代表的值就是清單中的
80. #
81. $(BIN) : $(COBJS) $(CPPOBJS)  
82.     $(CC) -o $(BIN) $(COBJS) $(CPPOBJS) $(LIBS)  
83.     rm $(COBJS)  
84.     rm $(CPPOBJS)  
85.     rm $(CDEF)  
86.     rm $(CPPDEF)  
87. # 連結為最終目标
88.   
89.   
90. #引入了.o檔案對.c和.h的依賴情況。以後.h被修改也會重新生成,可看看.d檔案内容即知道為何
91. #引入了依賴就相當于引入了一系列的規則,因為依賴内容例如: 目錄/xxx.o:目錄/xxx.c 目錄/xxx.h 也相當于隐含的引入了生成規則
92. #故上面不能在出現如: $(OBJS) : $(DEF)之類。切記
93. include $(CDEF)  
94. include $(CPPDEF)  
95. .PHONY:clean cleanall  
96.   
97. #清除所有目标檔案以及生成的最終目标檔案
98. clean:              
99.     rm $(BIN) $(COBJS) $(CPPOBJS)  
100. #rm *.d
101. cleanall:  
102.     rm $(CDEF) $(CPPDEF)  
103.     rm $(BIN) $(COBJS) $(CPPOBJS)      

轉自:http://lcinx.blog.163.com/blog/static/434942672010913291210/

上述makefile檔案使用時,生成.d檔案時會出錯,是以根據自己需要,對上述檔案做了修改,能夠正常使用了。

1. #
2. # c.cpp混合編譯的makefile模闆
3. #
4. #
5.   
6.   
7. BIN = ./bin/libEthernet.so  
8. CROSS = arm-linux-  
9. CC = $(CROSS)gcc  
10. CPP = $(CROSS)g++  
11. LD = $(CROSS)ld  
12. #這裡隻加入庫頭檔案路徑及庫路徑
13. INCS = #-I"c:/mingw/include"
14. LIBS = #-L"c:/mingw/lib"
15. SUBDIRS =  
16. #生成依賴資訊時的搜尋目錄,比如到下列目錄中搜尋一個依賴檔案(比如.h檔案),例如 -I"./***/" -I"./base/"
17. DEFINC = -I./snap7/ -I./snap7/src/sys/ -I./snap7/src/lib/ -I./snap7/src/core/  
18. #給INCS加上依賴搜尋路徑,分開寫可能會産生不一緻情況,而且繁瑣
19. INCS += $(DEFINC)  
20. #
21. #maintest.c tree/rbtree.c  多了子目錄,那就直接添加 目錄/*.c即可   所有的源檔案--  .c檔案清單
22. CSRCS = $(wildcard ./*.c ./snap7/*.c)  
23. CPPSRCS = $(wildcard ./snap7/src/sys/*.cpp ./snap7/src/lib/*.cpp ./snap7/src/core/*.cpp)  
24. #
25. #所有的.o檔案清單
26. COBJS := $(CSRCS:.c=.o)  
27. CPPOBJS := $(CPPSRCS:.cpp=.o)  
28. #
29. #生成依賴資訊 -MM是隻生成自己的頭檔案資訊,-M 包含了标準庫頭檔案資訊。
30. #-MT 或 -MQ都可以改變生成的依賴  xxx.o:src/xxx.h 為 src/xxx.o:src/xxx.h 當然。前面的 src/xxx.o需自己指定
31. #格式為 -MM 輸入.c或.cpp  查找依賴路徑  -MT或-MQ  生成規則,比如src/xxx.o
32. #MAKEDEPEND = gcc -MM -MT
33. CFLAGS += $(INCS)  
34. CFLAGS += -O2 -Wall -g -fPIC  
35. CPPFLAGS += $(INCS)  
36. CPPFLAGS += -O2 -Wall -g -fPIC  
37. LDFLAGS += -shared -fPIC -lpthread -lm -lrt -lstdc++  
38.   
39. all:$(BIN)  
40. #$(OBJS):%.o :%.c  先用$(OBJS)中的一項,比如foo.o: %.o : %.c  含義為:試着用%.o比對foo.o。如果成功%就等于foo。如果不成功,
41. # Make就會警告,然後。給foo.o添加依賴檔案foo.c(用foo替換了%.c裡的%)
42. # 也可以不要下面的這個生成規則,因為下面的 include $(DEF)  就隐含了。此處為了明了,易懂。故留着
43. $(COBJS) : %.o: %.c  
44.     $(CC) $(CFLAGS) -c $< -o $@   
45. $(CPPOBJS) : %.o: %.cpp  
46.     $(CPP) $(CPPFLAGS) -c $< -o $@   
47.   
48. # $@--目标檔案,$^--所有的依賴檔案,$<--第一個依賴檔案。每次$< $@ 代表的值就是清單中的
49. #
50. $(BIN) : $(COBJS) $(CPPOBJS)  
51.     $(CC) -o $(BIN) $(COBJS) $(CPPOBJS) $(LDFLAGS) $(LIBS)   
52.     rm $(COBJS)  
53.     rm $(CPPOBJS)  
54. # 連結為最終目标
55.   
56.   
57. #引入了.o檔案對.c和.h的依賴情況。以後.h被修改也會重新生成,可看看.d檔案内容即知道為何
58. #引入了依賴就相當于引入了一系列的規則,因為依賴内容例如: 目錄/xxx.o:目錄/xxx.c 目錄/xxx.h 也相當于隐含的引入了生成規則
59. #故上面不能在出現如: $(OBJS) : $(DEF)之類。切記
60. .PHONY:clean cleanall  
61.   
62. #清除所有目标檔案以及生成的最終目标檔案
63. clean:              
64.     rm $(BIN) #$(COBJS) $(CPPOBJS)  
65. #rm *.d
66. cleanall:  
67.     rm $(BIN) $(COBJS) $(CPPOBJS)