簡單的makefile模板

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

相關文章
相關標籤/搜索