一個通用的C/C++編譯Makefile

以下是轉帖:》》》》》》》》》》》》》》》》》》》》》》》

這個帖子是我在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章