makefile不是總用到,每次用到的時候總要從新找資料,有點麻煩(怪本身基礎知識不紮實,汗)。留一個通用模板放這,方便之後使用shell
CC = gcc CXX = g++ LINK = g++ CFLAGS = -g -Wall -O2 TARGET = mk0 SRCS = $(wildcard *.cpp) SRCS += $(wildcard *.c) CXX_OBJS = $(patsubst %.cpp, %.o, $(wildcard *.cpp)) C_OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) all:$(TARGET) $(TARGET):$(CXX_OBJS) $(C_OBJS) $(LINK) $(CFLAGS) -o $@ $^ %.o:%.cpp $(CXX) $(CFLAGS) -c -o $@ $< %.o:%.c $(CC) $(CFLAGS) -c -o $@ $< .PHONY:clean clean: rm -rf *.o $(TARGET) $(CXX_OBJS) $(C_OBJS)
由於項目特殊性,常常c與cpp都會用到,因此簡單寫個這樣的makefile文件spa
上面makefile有很大侷限性,好比只能使用與全部源文件在一個目錄場景。下面展現能夠多個目錄下源文件,以及程序使用動態庫的特殊場景code
CC = gcc CXX = g++ LINKC = gcc
LINKCXX = g++ CFLAGS = -g -Wall -O2 TOP_DIR := $(shell pwd) SRC_DIRS := $(shell find $(TOP_DIR) -maxdepth 1 -type d) TARGET := $(TOP_DIR)/bin/mk0 INC_PATH = -I$(TOP_DIR)/include/ LIB_PATH = -L$(TOP_DIR)/lib/ EXT_LIB = -Wl,-rpath,$(TOP_DIR)/bin/ -lcsay CXX_SRCS = $(foreach dir, $(SRC_DIRS), $(wildcard $(dir)/*.cpp)) CXX_OBJS = $(patsubst %.cpp, %.o, $(CXX_SRCS)) C_SRCS = $(foreach dir, $(SRC_DIRS), $(wildcard $(dir)/*.c)) C_OBJS = $(patsubst %.c, %.o, $(C_SRCS)) all:$(TARGET) $(TARGET):$(CXX_OBJS) $(C_OBJS)
$(shell if [ ! -d $(TOP_DIR)/bin ]; then mkdir $(TOP_DIR)/bin; fi)
ifeq ($(CXX_SRCS),)
$(LINKC) $(LIB_PATH) $(EXT_LIB) $(CFLAGS) -o $@ $^
else
$(LINKCXX) $(LIB_PATH) $(EXT_LIB) $(CFLAGS) -o $@ $^
endif %.o:%.cpp
$(CXX) $(INC_PATH) $(CFLAGS) -c -o $@ $< %.o:%.c
$(CC) $(INC_PATH) $(CFLAGS) -c -o $@ $< .PHONY:clean clean: rm -rf $(TARGET) $(CXX_OBJS) $(C_OBJS)
如上所示,代碼包括了三個目錄:. func0 func1目錄。用到了一個動態庫,由於不想把動態庫放入/lib或者/usr/lib下,也不想修改LD_LIBRARY_PATH值。但願能像win下可執行文件跟dll在一塊兒那樣,因此使用了 -Wl,-rpath,$(TOP_DIR)/bin/ 指定程序運行時在當前目錄下的bin目錄找so庫。這是一個特殊場景,不須要用到時刪除 -Wl,-rpath,$(TOP_DIR)/bin/ 便可。blog