混合編譯c和cpp的makefile模板
- #
- # c.cpp混合編譯的makefile模板
- #
- #
-
- BIN = foyerserver.exe
- CC = gcc
- CPP = g++
- #這裏只加入庫頭文件路徑及庫路徑
- INCS =
- LIBS =
- SUBDIRS =
- #生成依賴信息時的搜索目錄,好比到下列目錄中搜索一個依賴文件(好比.h文件)
- DEFINC = -I"./../../base/" -I"./../common" -I"./../../lib/lxnet/" -I"./../../lib/tinyxml/src/"
- #給INCS加上依賴搜索路徑,分開寫可能會產生不一致狀況,並且繁瑣
- #
- #
- #maintest.c tree/rbtree.c 多了子目錄,那就直接添加 目錄/*.c便可 全部的源文件-- .c文件列表
- CSRCS = $(wildcard ./*.c ./../../base/log.c ./../../base/corsslib.c ./../../base/idmgr.c ./../../base/pool.c)
- CPPSRCS = $(wildcard ./*.cpp ./../common/backcommand.cpp ./../common/connector.cpp)
- #
- #
- #全部的.o文件列表
- COBJS := $(CSRCS:.c=.o)
- CPPOBJS := $(CPPSRCS:.cpp=.o)
- #
- #生成依賴信息 -MM是隻生成本身的頭文件信息,-M 包含了標準庫頭文件信息。
- #-MT 或 -MQ均可以改變生成的依賴 xxx.o:src/xxx.h 爲 src/xxx.o:src/xxx.h 固然。前面的 src/xxx.o需本身指定
- #格式爲 -MM 輸入.c或.cpp 查找依賴路徑 -MT或-MQ 生成規則,好比src/xxx.o
- MAKEDEPEND = gcc -MM -MT
- CFLAGS =
- #CFLAGS += -Wall -ansi -DWIN32 -DNDEBUG -O2
- CPPFLAGS =
- #CPPFLAGS += -Wall -DWIN32 -DNDEBUG -O2
- #-g 生成調試信息
- #-pedantic參數與-ansi一塊兒使用 會自動拒絕編譯非ANSI程序
- #-fomit-frame-pointer 去除函數框架
- #-Wmissing-prototypes -Wstrict-prototypes 檢查函數原型
- #針對每一個.c文件的.d依賴文件列表
- CDEF = $(CSRCS:.c=.d)
- CPPDEF = $(CPPSRCS:.cpp=.d)
- PLATS = win32-debug win32-release linux-debug linux-release
- none:
- @echo "Please choose a platform:"
- @echo " $(PLATS)"
- win32-debug:
- $(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"
- win32-release:
- $(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"
- linux-debug:
- $(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"
- linux-release:
- $(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"
- all:$(BIN)
- #生成.o的對本身目錄中.h .c的依賴信息.d文件到.c所在的路徑中
- #$(DEF)文件是.d文件名列表(含目錄),好比tree.d 匹配成功那麼%就是tree,而後在嘗試%.c,若是成功。則執行規則
- # $(<:.c=.o)是獲取此.c文件的名字(含路徑),而後變爲.o好比 src/xxx.o。 以造成以下
- # src/xxx.o : src/xxx.c ***.h ***.h 最前面!!注意。
- # 此作法是每一個.d都和生成他的.c在一個目錄裏,因此須要這樣作。
- # $(<:.c=.o)之類的 。此時的<至關於變量$< 。切記
- # : : : 含義同下
- $(CDEF) : %.d : %.c
- $(MAKEDEPEND) $(<:.c=.o) $< $(DEFINC) > $@
- $(CPPDEF) : %.d : %.cpp
- $(MAKEDEPEND) $(<:.cpp=.o) $< $(DEFINC) > $@
- #先刪除依賴信息
- #從新生成依賴信息
- #這裏出現了一個 $(MAKE) 沒有定義的變量。這個變量是由 Make 本身定義的,它的值即爲本身的位置,方便 Make 遞歸調用本身。
- depend:
- -rm $(CDEF)
- -rm $(CPPDEF)
- $(MAKE) $(CDEF)
- $(MAKE) $(CPPDEF)
- #$(OBJS):%.o :%.c 先用$(OBJS)中的一項,好比foo.o: %.o : %.c 含義爲:試着用%.o匹配foo.o。若是成功%就等於foo。若是不成功,
- # Make就會警告,而後。給foo.o添加依賴文件foo.c(用foo替換了%.c裏的%)
- # 也能夠不要下面的這個生成規則,由於下面的 include $(DEF) 就隱含了。此處爲了明瞭,易懂。故留着
- $(COBJS) : %.o: %.c
- $(CC) -c $< -o $@ $(INCS) $(DEFINC) $(CFLAGS)
- $(CPPOBJS) : %.o: %.cpp
- $(CPP) -c $< -o $@ $(INCS) $(DEFINC) $(CPPFLAGS)
- # $@--目標文件,$^--全部的依賴文件,$<--第一個依賴文件。每次$< $@ 表明的值就是列表中的
- #
- $(BIN) : $(COBJS) $(CPPOBJS)
- $(CPP) -o $(BIN) $(COBJS) $(CPPOBJS) $(LIBS)
- -rm $(COBJS) $(CPPOBJS)
- # 連接爲最終目標
-
- #引入了.o文件對.c和.h的依賴狀況。之後.h被修改也會從新生成,可看看.d文件內容即知道爲什麼
- #引入了依賴就至關於引入了一系列的規則,由於依賴內容例如: 目錄/xxx.o:目錄/xxx.c 目錄/xxx.h 也至關於隱含的引入了生成規則
- #故上面不能在出現如: $(OBJS) : $(DEF)之類。切記
- #include $(CDEF) $(CPPDEF)
- .PHONY:clean cleanall
- #清除全部目標文件以及生成的最終目標文件
- clean:
- -rm $(BIN) $(COBJS) $(CPPOBJS)
- #rm *.d
- cleanall:
- -rm $(BIN) $(COBJS) $(CPPOBJS)
歡迎關注本站公眾號,獲取更多信息