• 6178阅读
  • 0回复

[原创]一个可以用于编译qt程序的Makefile模板 [复制链接]

上一主题 下一主题
离线novesky
 

只看楼主 倒序阅读 楼主  发表于: 2011-01-31
— 本帖被 XChinux 执行加亮操作(2011-02-01) —
只需修改
  1. ### Automatic ######

上方的内容。
一般只要把头文件部分源文件写清楚就行,其他的根据自己的环境一次就能改好。
HEADERS_QOBJ为需要用moc编译的头文件(即包含Q_OBJECT宏),HEADERS =这里填写不需要moc编译的头文件。SRCS =填写HEADERS_QOBJ对应的源文件除外的源文件。TARGET为最终生成的可执行文件,若是库,则填写LIB_SO=或LIB_A=
也可以在HEADERS =处填写所有头文件,注释掉的HEADERS_QOBJ哪行取消注释,但是这样make一开始时速度会慢。

以上准备好后,可以make了

这个模板不像qmake生成的Makefile列举所有文件的依赖关系和规则,而是先生成一个moc.dep的文件,用来说明moc生成源文件的规则和依赖关系,然后用gcc来产生所有目标文件的依赖关系的文件并包含之,这样整个Makefile就比较简短了

  1. #########################################################################
  2. # Makefile for Making Qt applications
  3. # Created by Wang Bin wbsecg1@gmail.com, 2011/01/28
  4. #############################################################################
  5. HOST   = arm-linux
  6. CC      = gcc
  7. CXX      = g++
  8. STRIP   = strip
  9. AR      = ar
  10. AS      = as
  11. RANLIB   = ranlib
  12. INCPATH   =   -I$(QTDIR)/include -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui
  13. CFLAGS   =   -pipe -Wall -W -O2  -DNO_DEBUG $(INCPATH)
  14. CXXFLAGS=   -pipe -DQWS -fpic -fno-exceptions -fno-rtti -Wall -W -O2 -DNO_DEBUG $(INCPATH)
  15. LINK           =   $(CXX)
  16. LFLAGS   =   -lQtCore -lQtGui
  17. LIBS           =   -L"$(QTDIR)lib" -lQtCore4 -lQtGui4
  18. MOC      =   $(QTDIR)/bin/moc
  19. UIC      =   $(QTDIR)/bin/uic
  20. TAR      =   tar -cf
  21. BZ      =    bzip2 --compress --force -9
  22. ################# Specify headers, qobject headers, srcs and targets below #################
  23. HEADERS   =
  24. #HEADERS_QOBJ   = $(foreach h,$(HEADERS),$(if $(shell grep "Q_OBJECT" $(h)),$(h))) #very slow
  25. HEADERS_QOBJ +=  
  26. SRCS   = main.cpp  
  27. TARGET   =
  28. LIB_SO   =
  29. LIB_A   =
  30. OBJDIR   = objs
  31. #OBIDIR = ./ 如果是该目录下
  32. ############################################ Automatic ############################################
  33. ifneq ($(HOST),)
  34. HOSTE   := $(addsuffix -,$(HOST))
  35. CC      := $(addprefix $(HOSTE),$(CC))
  36. CXX      := $(addprefix $(HOSTE),$(CXX))
  37. AR      := $(addprefix $(HOSTE),$(AR))
  38. AS      := $(addprefix $(HOSTE),$(AS))
  39. STRIP   := $(addprefix $(HOSTE),$(STRIP))
  40. RANLIB    := $(addprefix $(HOSTE),$(RANLIB))
  41. endif
  42. AR      := $(AR) r
  43. HEADERS      +=   $(HEADERS_QOBJ)
  44. SRCS_QOBJ   = $(HEADERS_QOBJ:.h=.cpp)
  45. SRCS_MOC   = $(join $(dir $(SRCS_QOBJ)),$(patsubst %,moc_%,$(notdir $(SRCS_QOBJ))))
  46. OBJS      := $(addprefix $(OBJDIR)/,$(subst .cpp,.o,$(SRCS)))
  47. OBJS_QOBJ   = $(addprefix $(OBJDIR)/,$(patsubst %.cpp,%.o,$(SRCS_QOBJ)))
  48. OBJS_MOC   = $(patsubst ./%,$(OBJDIR)/%,$(patsubst %.cpp,%.o,$(SRCS_MOC)))
  49. SRCS      += $(SRCS_QOBJ) $(SRCS_MOC)
  50. OBJS      += $(OBJS_QOBJ) $(OBJS_MOC)
  51. DEP       = $(OBJS:.o=.d)
  52. MPKG_SUBDIR   = $(MPKG_DIR)/$(notdir $(basename $(TARGET)))
  53. .PHONY: all clean dist strip
  54. all: $(TARGET) $(LIB_SO) $(LIB_A)
  55. $(OBJDIR):
  56.    test -d $@ || mkdir -p $@
  57. $(OBJDIR)/%.o: %.cpp
  58.    @echo "Making $@..."
  59.    $(CXX) -c $(CXXFLAGS) -o $@ $<
  60.   
  61. $(OBJDIR)/%.d: %.cpp $(OBJDIR)
  62.    @echo "Generating $@..."
  63.    -@$(CXX) $(CXXFLAGS) -w -MM $< |sed -e '1s/\(.*\)/$(OBJDIR)\/\1/' >$@
  64.   
  65. $(TARGET): $(OBJS)
  66.    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
  67. $(LIB_SO): $(OBJS)
  68.    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
  69.   
  70. $(LIB_A): $(OBJS)
  71.    $(AR) $@  $(QTABOBJS) $^
  72.    $(RANLIB) $@
  73. moc.dep: $(HEADERS_QOBJ)
  74.    echo "################Rules of moc srcs!#################" >$@
  75.    @for header in $(HEADERS_QOBJ); do \
  76.       echo `echo ./$$header |sed 's/\(.*\)\/\(.*\).h/\1\/moc_\2.cpp/'`: $$header >>$@; \
  77.       echo '   $$(MOC) $$< >$$@' >>$@; \
  78.       echo >>$@; \
  79.    done
  80.     
  81. dist:
  82.    $(TAR) $(basename $(TARGET)).tar Makefile $(SRCS_QOBJ) $(HEADERS_QOBJ) $(INTERFACES)
  83.    $(BZ) $(basename $(TARGET)).tar
  84. clean:
  85.    -rm -f $(OBJS) $(OBJS_MOC) $(SRCS_MOC) $(TARGET) $(LIB_SO) $(LIB_A) $(DEP)
  86.    -rm -f `find ./ -name \*~` core
  87.   
  88. strip: $(TARGET)
  89.    cp $< $<_unstripped
  90.    -$(STRIP) $<
  91.   
  92. -include moc.dep
  93. -include $(DEP)
快速回复
限100 字节
 
上一个 下一个