一點一點學寫Makefile(6)-遍歷當前目錄源文件及其子目錄下源文件


時候,我們在開發的時候需要將本次工程的代碼分成多個子目錄來編寫,但是在Makefile的編寫上卻是個問題,下面我就教大家怎么構建帶有子文件夾的源代碼目錄的自動掃描編譯

下面這張圖是我的文件樹


這里面src目錄下是我的源代碼,我將功能代碼分成了三個子模塊,分別為test1, test2, test3, 調用這三個子模塊的是main.cpp文件,下面我將這三個子模塊的代碼

  1. //  src/test1/test1.h  
  2. #ifndef __TEST1_H__  
  3. #define __TEST1_H__  
  4. int test1();  
  5. #endif //__TEST1_H__  
  6.   
  7. // src/test1/test1.cpp  
  8. #include "test1.h"  
  9.   
  10. int test1() {  
  11.     return 1;     
  12. }  
  13.   
  14. <pre name="code" class="cpp">//  src/test2/test2.h  
  15. #ifndef __TEST2_H__  
  16. #define __TEST2_H__  
  17. int test2();  
  18. #endif //__TEST2_H__  
  19.   
  20. // src/test2/test2.cpp  
  21. #include "test2.h"  
  22.   
  23. int test2() {  
  24.     return 2;     
  25. }  

 

  1. //  src/test3/test3.h  
  2. #ifndef __TEST3_H__  
  3. #define __TEST3_H__  
  4. int test3();  
  5. #endif //__TEST3_H__  
  6.   
  7. // src/test3/test3.cpp  
  8. #include "test3.h"  
  9.   
  10. int test3() {  
  11.     return 3;     
  12. }  


// src/main.cpp
#include <iostream>
#include "test1/test1.h"
#include "test2/test2.h"
#include "test3/test3.h"

using namespace std;

int main() {
    cout << "test1()" << test1() << endl;
    cout << "test2()" << test2() << endl;
    cout << "test3()" << test3() << endl;
}

Makefile遍歷的核心代碼如下:

[plain] view plain copy
  1. SRC_PATH = ./src  
  2. DIRS = $(shell find $(SRC_PATH) -maxdepth 3 -type d)  
  3.   
  4. # 為了更大幅度的支持項目的搭建,將三種文件格式的后綴都單獨便利到變量中  
  5. SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))  
  6. SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc))  
  7. SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))  
  8.   
  9. OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP))  
  10. OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC))  
  11. OBJS_C = $(patsubst %.c, %.o, $(SRCS_C))  


下面是Makefile的全部文件

       
        CROSS =   
        CC = $(CROSS)gcc  
        CXX = $(CROSS)g++  
        DEBUG =   
        CFLAGS = $(DEBUG) -Wall -c  
        MV = mv -f  
        RM = rm -rf  
        LN = ln -sf  
          
        TARGET = classify  
          
        TOP_PATH = $(shell pwd)  
        SRC_PATH = $(TOP_PATH)/src  
        MOD_PATH = $(TOP_PATH)/modules  
        MOD_LIB_PATH = $(MOD_PATH)/lib  
        MOD_INC_PATH = $(MOD_PATH)/include  
        DIRS = $(shell find $(SRC_PATH) -maxdepth 3 -type d)  
        FILES = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))  
          
        ##########################################################  
        # modules  
        ##########################################################  
        modules =   
        MODULES_PATH = $(foreach m, $(modules), $(MOD_PATH)/$(m))  
          
        ##########################################################  
        # srcs  
        ##########################################################  
        SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))  
        SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc))  
        SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))  
          
        ##########################################################  
        # objs  
        ##########################################################  
        OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP))  
        OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC))  
        OBJS_C = $(patsubst %.c, %.o, $(SRCS_C))  
          
        ##########################################################  
        # paths  
        ##########################################################  
        INC_PATH += -I$(MOD_INC_PATH)  
        INC_PATH += -I$(MOD_PATH)  
        LIB_PATH += -L$(TOP_PATH)/lib  
        LIB_PATH += -L$(MOD_LIB_PATH)  
          
        ##########################################################  
        # libs  
        ##########################################################  
          
        ##########################################################  
        # building  
        ##########################################################  
        all:$(TARGET)  
          
        $(TARGET) : $(OBJS_CPP) $(OBJS_CC) $(OBJS_C)  
            @ for i in $(MODULES_PATH); \  
            do \  
            make -C $$i; \  
            done  
          
            @ $(CXX) $^ -o $@ $(LIB_PATH) $(LIBS)  
            @ echo Create $(TARGET) ok...  
          
        $(OBJS_CPP):%.o : %.cpp  
            $(CXX) $(CFLAGS) $< -o $@ $(INC_PATH)  
          
        $(OBJS_CC):%.o : %.cc  
            $(CXX) $(CFLAGS) $< -o $@ $(INC_PATH)  
          
        $(OBJS_C):%.o : %.c  
            $(CXX) $(CFLAGS) $< -o $@ $(INC_PATH)  
          
        .PHONY : clean  
        clean:  
            @ $(RM) $(TARGET) $(OBJS_CPP) $(OBJS_CC) $(OBJS_C)  
            @ for i in $(MODULES_PATH); \  
            do \  
            make clean -C $$i; \  
            done  
            @echo clean all... 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM