天天看点

一个通用的Makefile(自动遍历文件、C和C++混合)支持完整Makefile:

文章目录

  • 支持
    • 1.自动遍历源文件
    • 2.C和C++文件混合使用
    • 3.链接库
    • 4.其他编译选择
  • 完整Makefile:

这是一个通用的Makefile

支持

1.自动遍历源文件

  自动遍历源文件文件部分参考 https://blog.csdn.net/yuliying/article/details/49635485

AllDIRS := $(shell ls -R | grep '^\./.*:$$' | awk '{gsub(":","");print}') .
CSRCS = $(foreach n,$(AllDIRS) , $(wildcard $(n)/*.c)) 
CXXSRCS = $(foreach n,$(AllDIRS) , $(wildcard $(n)/*.cpp)) 
           

  暂时无法遍历头文件,使用时如头文件不在当前路径,需添加头文件路径,如:

INC_PATH = -I $(SRC_PATH) \
				-I $(SRC_PATH)/inc\
           

2.C和C++文件混合使用

  C和CPP文件分开编译,使用g++链接

%.o : %.cpp

	$(CXX) $(DEBUG_FLAG) $< -c -o [email protected] $(INC_PATH) $(LIB_PATH);

%.o : %.c

	$(CC) $(DEBUG_FLAG) $< -c -o  [email protected] $(INC_PATH) $(LIB_PATH);

$(TARGET) : $(OBJS)

	$(CXX) $(DEBUG_FLAG) $^ -o [email protected] $(INC_PATH) $(LIB_PATH);

	@echo "> build success <"	

           

3.链接库

  如需链接库(如线程-lpthread)则将选项加在LIB_PATH = 后

LIB_PATH = -lpthread
           

4.其他编译选择

  如需添加其他编译选项(如-g支持GDB调试)则将选项加在DEBUG_FLAG :=后

DEBUG_FLAG := -g
           

完整Makefile:

TARGET = exe

CC = gcc

CXX = g++


AllDIRS := $(shell ls -R | grep '^\./.*:$$' | awk '{gsub(":","");print}') .

CSRCS = $(foreach n,$(AllDIRS) , $(wildcard $(n)/*.c)) 

CXXSRCS = $(foreach n,$(AllDIRS) , $(wildcard $(n)/*.cpp)) 

OBJS := $(CSRCS:.c=.o) $(CXXSRCS:.cpp=.o)

SRC_PATH = .


INC_PATH = -I $(SRC_PATH) \
				-I $(SRC_PATH)/inc\


LIB_PATH = -lpthread

DEBUG_FLAG  =

#DEBUG_FLAG := -g				


%.o : %.cpp

	$(CXX) $(DEBUG_FLAG) $< -c -o [email protected] $(INC_PATH) $(LIB_PATH);

%.o : %.c

	$(CC) $(DEBUG_FLAG) $< -c -o  [email protected] $(INC_PATH) $(LIB_PATH);


$(TARGET) : $(OBJS)

	$(CXX) $(DEBUG_FLAG) $^ -o [email protected] $(INC_PATH) $(LIB_PATH);

	@echo "> build success <"


.PHONY:clean


clean:

	rm -f $(OBJS) $(TARGET)