这个帖子是我在csdn上花了10分下载下来的一个包,里面就这么多东西,那个上传者是他妈的黑。。。。不过我把它共享到这里,不过为了尊重人的劳动成果,我还是贴出人家的下载地址:http://download.csdn.net/source/949149,这里面的内容很经典,但是我水平低,很多看不懂,咳,不过,先占着。呵呵。。。。。########################################################################################## Generic Makefile for C/C++Program## Author: mengk# Date:   2008/08/30#=======================================================================================   # 一 、 操作系统及shell相关#########################################################################################指定使用的shell及取得操作系统类型,宏定义常用shell命令 #指定SHELL ,SHELL := /bin/sh ,或者使用当前SHELL设置#SHELL := /bin/bash #取得操作系统名称#OS_NAME="Linux:SunOS:HP-UX:AIX"OS_NAME := $(shell uname -s)  #把常用的几个系统命令自定义名称和选现,rm命令前面加了一个小减号的意思就是,#也许某些文件出现问题,但不要管,继续做后面的事 AR := ar            SED:= sed          AWK:= awkMV := mvRM := rm -fECHO := echo #=======================================================================================  # 二 、C编译器选项#########################################################################################指定C编译器, 如gcc  编译器CC      := gcc#指定C编译时的选项#CFLAGS         C语言编译器参数,编译时使用。CFLAGS := -c -g  -W -Wall # CPP ,  C 预编译器的名称,默认值为 $(CC) -E。CPP :=#   CPPFLAGS , C 预编译的选项。CPPFLAGS :=  # 三 、C++编译器选项#########################################################################################======================================================================================= #指定C++编译器, 如g++ 编译器CXX      := g++ #指定C编译时的选项#CXXFLAGS         C++语言编译器参数,编译时使用。CXXFLAGS := -c -g -W -Wall # CXXPP ,  C++ 预编译器的名称,默认值为 $(CC) -E。CXXPP :=#   CXXPPFLAGS , C++ 预编译的选项。CXXPPFLAGS := #=======================================================================================  # 四、指定额外搜索的头文件路径、库文件路径 、引入的库#########################################################################################指定搜索路径, 也可用include指定具体文件路径,编译时使用# The include files ( C andC++ common).INCLUDES :=-I$(ORACLE_HOME)/rdbms/demo -I$(ORACLE_HOME)/rdbms/public  \  -I$(ORACLE_HOME)/plsql/public-I$(ORACLE_HOME)/network/public -I./include -I./include/app -I./include/tools  \  -I./include/tools/file  -I./include/tools/common # 指定函数库搜索路径DIRECTORY 搜寻库文件(*.a)的路径,加入需要的库搜索路径功能同–l,由用户指定库的路径,否则编译器将只在标准库的目录找。           #连接时使用LIBDIRS :=-L$(ORACLE_HOME)/lib-L$(ORACLE_HOME)/rdbms/lib # 链接器参数,  连接时搜索指定的函数库LDFLAGS。,引入需要的库-lLDFLAGS    指定编译的时候使用的库. 连接库文件开关。例如-lugl,则是把程序同libugl.a文件进行连接。#连接时使用#-lclntsh -lnsl -lpthread-Wl,-Bdynamic -lgcc_s    ,同时有动态库和静态库时默认使用动态库,   -Wl,-Bdynamic 指定和动态库相连, -Wl,-Bstatic 指定和静态库相连CLDFLAGS    := -lm  -lclntsh -lnsl -lpthread  -Wl,-Bdynamic -lgcc_sCXXLDFLAGS  := -lm  -lclntsh -lnsl -lpthread  -Wl,-Bdynamic -lgcc_s  -lstdc++  #宏定义,如果没有定义宏的值,默认是字符串1 ,定义值为数字时直接写数字,字符和字符串需用\"和\'转义#DCPPFLAGS :=  -D${OS_NAME}  -D_TEST1_  -D_TEST2_=2  -D_TEST3_=\"a\"  -D_TEST4_=\'b\' -DOS_NAME=\"${OS_NAME}\"DCPPFLAGS := -D${OS_NAME}    #各平台'SunOS'   'Linux' link类库差异, 设置特定值ifeq '${OS_NAME}' 'SunOS'    CLDFLAGS += -lsocket    CXXLDFLAGS += -lsocket    DCPPFLAGS += -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANTendif #=======================================================================================  #  五、 指定源文件的路径 、支持的源文件的扩展名 、源文件搜索路径######################################################################################### 指定SRC_DIR 源代码文件路径./src  ./src2  src2/src3SRC_DIR   := . ./src  ./src/copyfile  ./src/displayfile ./include/tools/file  ./include/tools/common  #指定支持的源代码扩展名 SFIX     := .out .a .ln  .o .c  .cc .C  .p .f  .F #.r  .y .l  .s  .S .mod  .sym  .def .h  .info  .dvi .tex  .texinfo  .texi #.txinfo  .w  .ch.web  .sh .elc  .elSFIX     :=  .c.C .cpp  .cc .CPP  .c++ .cp  .cxx #在当当前目录找不到的情况下,到VPATH所指定的目录中去找寻文件了。如:VPATH= src:../headers#(当然,当前目录永远是最高优先搜索的地方)VPATH := ${SRC_DIR} #定义安装目录            BIN := ./bin #=======================================================================================  #  六、 得到源文件名称集合、OBJS目标文件名集合######################################################################################## #依次循环取得各目录下的所有源文件,在各目录下取源文件时过滤不支持的源文件格式,#得到源文件集合(带路径)SOURCES := $(foreach x,${SRC_DIR},\           $(wildcard  \             $(addprefix  ${x}/*,${SFIX}) ) ) #去掉路径信息,去掉扩展名,再追加.o的扩展名,得到目标文件名集合(不带路径),需要去掉路径信息,否则连接时有可能找不到.o文件OBJS := $(addsuffix .o,$(basename $(notdir ${SOURCES}) ) )      #去掉路径信息,去掉扩展名,再追加.d的扩展名,得到依赖文件名集合(不带路径)#DEPENDS := $(addsuffix .d,$(basename $(notdir ${SOURCES}) ) ) #去掉扩展名,再追加.d的扩展名,得到依赖文件名集合 (带路径)DEPENDS := $(addsuffix .d,$(basename  ${SOURCES} ) )  #DEPENDS :=$(SOURCES:$(SFIX)=.d) #=======================================================================================  #  七、 定义生成程序的名称######################################################################################## #生成可执行程序的名称PROGRAM   := example #=======================================================================================  #  八、 定义依赖关系 ,编译、链接规则######################################################################################## #.PHONY”表示,clean是个伪目标文件。.PHONY : all check  clean  install  #定义编译、链接任务allall :  ${PROGRAM} install #检查源码中,除了C源码外是否有C++源码 ,并定义变量LDCXX存储检查结果LDCXX := $(strip$(filter-out  %.c , ${SOURCES} ) ) #编译器重置ifdef LDCXX   #有C++源码时,所有源码都使用g++编译,包括C源码,将CC、CFLAGS 的值设置为对应的${CXX}、${CXXFLAGS}的值    CC := ${CXX}                   #重置C编译器为C++编译器    CFLAGS :=  ${CXXFLAGS}          #重置C编译选现为C++编译选现    CPP :=  ${CXXPP}                #重置C预编译器为C++预编译器    CPPFLAGS := ${CXXPPFLAGS}      #重置C预编译的选项为C++预编译的选项endif #链接${PROGRAM} :  ${DEPENDS} ${OBJS} ifeq ($(strip$(filter-out  %.c  , ${SOURCES} ) ),)    #只有C源码时使用gcc连接    ${CC}  ${LIBDIRS}  ${CLDFLAGS}   ${OBJS} -o $@    else                                                 #有C++源码时使用g++连接    $(CXX) ${LIBDIRS}  ${CXXLDFLAGS}    ${OBJS} -o $@     endif # Rules for producing theobjects. (.o) BEGIN#--------------------------------------------------- %.o : %.c    $(CC)      ${DCPPFLAGS}    ${CFLAGS}      ${INCLUDES}   $ %.o : %.C    $(CXX)     ${DCPPFLAGS}    ${CXXFLAGS}    ${INCLUDES}   $ %.o : %.cc    ${CXX}     ${DCPPFLAGS}    ${CXXFLAGS}    ${INCLUDES}   $ %.o : %.cpp    ${CXX}     ${DCPPFLAGS}    ${CXXFLAGS}    ${INCLUDES}   $ %.o : %.CPP    ${CXX}     ${DCPPFLAGS}    ${CXXFLAGS}    ${INCLUDES}   $ %.o : %.c++    ${CXX}     ${DCPPFLAGS}    ${CXXFLAGS}    ${INCLUDES}   $ %.o : %.cp    ${CXX}     ${DCPPFLAGS}    ${CXXFLAGS}    ${INCLUDES}   $ %.o : %.cxx    ${CXX}     ${DCPPFLAGS}    ${CXXFLAGS}    ${INCLUDES}   $ #---------------------------------------------------# Rules for producing theobjects.(.o) END  # Rules for creating thedependency files (.d). BEGIN#---------------------------------------------------%.d : %.c    @${CC}     -M   -MD   ${INCLUDES} $ %.d : %.C    @${CXX}    -MM  -MD   ${INCLUDES} $ %.d : %.cc    @${CXX}    -MM  -MD   ${INCLUDES} $ %.d : %.cpp    @${CXX}    -MM  -MD   ${INCLUDES} $ %.d : %.CPP    @${CXX}    -MM  -MD   ${INCLUDES} $ %.d : %.c++    @${CXX}    -MM  -MD   ${INCLUDES} $ %.d : %.cp    @${CXX}    -MM  -MD   ${INCLUDES} $ %.d : %.cxx    @${CXX}    -MM  -MD   ${INCLUDES} $ #---------------------------------------------------# Rules for creating thedependency files (.d). END  #=======================================================================================  #  九、 定义其他 check install clean 等任务######################################################################################## #定义检查环境相关的变量的任务check :    @${ECHO}  MAKEFILES : ${MAKEFILES}    @${ECHO}  MAKECMDGOALS : ${MAKECMDGOALS}    @${ECHO}  SHELL  : ${SHELL}    @${ECHO}  OS_NAME  : ${OS_NAME}    @${ECHO}  SRC_DIR : ${SRC_DIR}    @${ECHO}  SFIX : ${SFIX}    @${ECHO}  VPATH : ${VPATH}    @${ECHO}  BIN : ${BIN}    @${ECHO}  SOURCES : ${SOURCES}    @${ECHO}  OBJS : ${OBJS}    @${ECHO}  DEPENDS : ${DEPENDS}    @${ECHO}  PROGRAM : ${PROGRAM}    @${ECHO}  CC :  ${CC}    @${ECHO}  CFLAGS : ${CFLAGS}    @${ECHO}  CPP : ${CPP}    @${ECHO}  CPPFLAGS : ${CPPFLAGS}    @${ECHO}  CXX :  ${CXX}    @${ECHO}  CXXFLAGS : ${CXXFLAGS}    @${ECHO}  CXXPP : ${CXXPP}    @${ECHO}  CXXPPFLAGS : ${CXXPPFLAGS}           @${ECHO}  INCLUDES : ${INCLUDES}    @${ECHO}  LIBDIRS : ${LIBDIRS}    @${ECHO}  CLDFLAGS : ${CLDFLAGS}    @${ECHO}  CXXLDFLAGS : ${CXXLDFLAGS}    @${ECHO}  DCPPFLAGS : ${DCPPFLAGS}    uname    -a #定义清理的任务 core.*  ,rm命令前面加了一个小减号的意思就是, 也许某些文件出现问题,但不要管,继续做后面的事clean :    -${RM} ${BIN}/${PROGRAM}    -${RM} ${BIN}/*.o    -${RM} ${BIN}/*.d    -${RM} *.o    -${RM} *.d #将目标文件及可执行程序拷贝到安装目录install :    -${MV} ${PROGRAM} ${BIN}    -${MV}  *.o ${BIN}    -${MV}  *.d ${BIN}  #=======================================================================================  
11-01 22:24