混合编译c和cpp的makefile模板

  1. #  
  2. # c.cpp混合编译的makefile模板  
  3. #  
  4. #  
  5.   
  6. BIN = foyerserver.exe  
  7. CC = gcc  
  8. CPP = g++  
  9. #这里只加入库头文件路径及库路径  
  10. INCS =   
  11. LIBS =   
  12. SUBDIRS =  
  13. #生成依赖信息时的搜索目录,好比到下列目录中搜索一个依赖文件(好比.h文件)  
  14. DEFINC = -I"./../../base/" -I"./../common" -I"./../../lib/lxnet/" -I"./../../lib/tinyxml/src/"  
  15. #给INCS加上依赖搜索路径,分开写可能会产生不一致状况,并且繁琐  
  16. #  
  17. #  
  18. #maintest.c tree/rbtree.c  多了子目录,那就直接添加 目录/*.c便可   全部的源文件--  .c文件列表  
  19. CSRCS = $(wildcard  ./*.c ./../../base/log.c ./../../base/corsslib.c ./../../base/idmgr.c ./../../base/pool.c)  
  20. CPPSRCS = $(wildcard ./*.cpp ./../common/backcommand.cpp ./../common/connector.cpp)  
  21. #  
  22. #  
  23. #全部的.o文件列表  
  24. COBJS := $(CSRCS:.c=.o)  
  25. CPPOBJS := $(CPPSRCS:.cpp=.o)  
  26. #  
  27. #生成依赖信息 -MM是只生成本身的头文件信息,-M 包含了标准库头文件信息。  
  28. #-MT 或 -MQ均可以改变生成的依赖  xxx.o:src/xxx.h 为 src/xxx.o:src/xxx.h 固然。前面的 src/xxx.o需本身指定  
  29. #格式为 -MM 输入.c或.cpp  查找依赖路径  -MT或-MQ  生成规则,好比src/xxx.o   
  30. MAKEDEPEND = gcc -MM -MT  
  31. CFLAGS =  
  32. #CFLAGS += -Wall -ansi -DWIN32 -DNDEBUG -O2  
  33. CPPFLAGS =  
  34. #CPPFLAGS += -Wall -DWIN32 -DNDEBUG -O2  
  35. #-g 生成调试信息  
  36. #-pedantic参数与-ansi一块儿使用 会自动拒绝编译非ANSI程序  
  37. #-fomit-frame-pointer 去除函数框架  
  38. #-Wmissing-prototypes -Wstrict-prototypes 检查函数原型  
  39. #针对每一个.c文件的.d依赖文件列表  
  40. CDEF = $(CSRCS:.c=.d)  
  41. CPPDEF = $(CPPSRCS:.cpp=.d)  
  42. PLATS = win32-debug win32-release linux-debug linux-release  
  43. none:  
  44.     @echo "Please choose a platform:"  
  45.     @echo " $(PLATS)"  
  46. win32-debug:  
  47.     $(MAKE) all INCS=-I"c:/mingw/include" LIBS="-L"c:/mingw/lib" -L"./../../lib/lxnet" -llxnet -lws2_32 -L"./../../lib/tinyxml" -ltinyxml" CFLAGS="-Wall -DWIN32 -DDEBUG -g" CPPFLAGS="-Wall -DWIN32 -DDEBUG -g"  
  48. win32-release:  
  49.     $(MAKE) all INCS=-I"c:/mingw/include" LIBS="-L"c:/mingw/lib" -L"./../../lib/lxnet" -llxnet -lws2_32 -L"./../../lib/tinyxml" -ltinyxml" CFLAGS="-Wall -DWIN32 -DNDEBUG -O2" CPPFLAGS="-Wall -DWIN32 -DNDEBUG -O2"  
  50. linux-debug:  
  51.     $(MAKE) all INCS=-I"/usr/include" LIBS="-L"/usr/lib" -L"./../../lib/lxnet" -llxnet -lpthread -L"./../../lib/tinyxml" -ltinyxml" CFLAGS="-Wall -DDEBUG -g" CPPFLAGS="-Wall -DDEBUG -g"  
  52. linux-release:  
  53.     $(MAKE) all INCS=-I"/usr/include" LIBS="-L"/usr/lib" -L"./../../lib/lxnet" -llxnet -lpthread -L"./../../lib/tinyxml" -ltinyxml" CFLAGS="-Wall -DNDEBUG -O2" CPPFLAGS="-Wall -DNDEBUG -O2"  
  54. all:$(BIN)  
  55. #生成.o的对本身目录中.h .c的依赖信息.d文件到.c所在的路径中  
  56. #$(DEF)文件是.d文件名列表(含目录),好比tree.d 匹配成功那么%就是tree,而后在尝试%.c,若是成功。则执行规则  
  57. # $(<:.c=.o)是获取此.c文件的名字(含路径),而后变为.o好比 src/xxx.o。 以造成以下  
  58. # src/xxx.o : src/xxx.c ***.h  ***.h  最前面!!注意。    
  59. # 此作法是每一个.d都和生成他的.c在一个目录里,因此须要这样作。  
  60. # $(<:.c=.o)之类的 。此时的<至关于变量$< 。切记  
  61. # : : :  含义同下  
  62. $(CDEF) : %.d : %.c  
  63.     $(MAKEDEPEND) $(<:.c=.o) $< $(DEFINC) > $@  
  64. $(CPPDEF) : %.d : %.cpp  
  65.     $(MAKEDEPEND) $(<:.cpp=.o) $< $(DEFINC) > $@  
  66. #先删除依赖信息  
  67. #从新生成依赖信息  
  68. #这里出现了一个 $(MAKE) 没有定义的变量。这个变量是由 Make 本身定义的,它的值即为本身的位置,方便 Make 递归调用本身。  
  69. depend:  
  70.     -rm $(CDEF)  
  71.     -rm $(CPPDEF)  
  72.     $(MAKE) $(CDEF)  
  73.     $(MAKE) $(CPPDEF)  
  74. #$(OBJS):%.o :%.c  先用$(OBJS)中的一项,好比foo.o: %.o : %.c  含义为:试着用%.o匹配foo.o。若是成功%就等于foo。若是不成功,  
  75. # Make就会警告,而后。给foo.o添加依赖文件foo.c(用foo替换了%.c里的%)  
  76. # 也能够不要下面的这个生成规则,由于下面的 include $(DEF)  就隐含了。此处为了明了,易懂。故留着  
  77. $(COBJS) : %.o: %.c  
  78.     $(CC) -c $< -o $@ $(INCS) $(DEFINC) $(CFLAGS)  
  79. $(CPPOBJS) : %.o: %.cpp  
  80.     $(CPP) -c $< -o $@ $(INCS) $(DEFINC) $(CPPFLAGS)  
  81. # $@--目标文件,$^--全部的依赖文件,$<--第一个依赖文件。每次$< $@ 表明的值就是列表中的  
  82. #  
  83. $(BIN) : $(COBJS) $(CPPOBJS)  
  84.     $(CPP) -o $(BIN) $(COBJS) $(CPPOBJS) $(LIBS)  
  85.     -rm $(COBJS) $(CPPOBJS)  
  86. # 连接为最终目标  
  87.   
  88. #引入了.o文件对.c和.h的依赖状况。之后.h被修改也会从新生成,可看看.d文件内容即知道为什么  
  89. #引入了依赖就至关于引入了一系列的规则,由于依赖内容例如: 目录/xxx.o:目录/xxx.c 目录/xxx.h 也至关于隐含的引入了生成规则  
  90. #故上面不能在出现如: $(OBJS) : $(DEF)之类。切记  
  91. #include $(CDEF) $(CPPDEF)  
  92. .PHONY:clean cleanall  
  93. #清除全部目标文件以及生成的最终目标文件  
  94. clean:            
  95.     -rm $(BIN) $(COBJS) $(CPPOBJS)  
  96. #rm *.d  
  97. cleanall:  
  98.     -rm $(BIN) $(COBJS) $(CPPOBJS)  
相关文章
相关标签/搜索