以下是轉帖:》》》》》》》》》》》》》》》》》》》》》》》
這個帖子是我在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:= awk
MV := mv
RM := rm -f
ECHO := 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 and C++ 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_s
CXXLDFLAGS := -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_REENTRANT
endif
#=======================================================================================
# 五、 指定源文件的路徑 、支持的源文件的擴展名 、源文件搜索路徑
########################################################################################
# 指定SRC_DIR 源代碼文件路徑./src ./src2 src2/src3
SRC_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 .el
SFIX := .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
#定義編譯、鏈接任務all
all : ${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 the objects. (.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 the objects.(.o) END
# Rules for creating the dependency 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 the dependency 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}
#=======================================================================================
摘自http://blog.chinaunix.net/space.php?uid=25100840&do=blog&id=2047826