简单的makefile模板

makefile不是总用到,每次用到的时候总要重新找资料,有点麻烦(怪自己基础知识不扎实,汗)。留一个通用模板放这,方便以后使用

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文件

上面makefile有很大局限性,比如只能使用与所有源文件在一个目录场景。下面展示可以多个目录下源文件,以及程序使用动态库的特殊场景

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/ 即可。

原文地址:https://www.cnblogs.com/littlejohnny/p/3688702.html