天天看點

一個通用的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)