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