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)