zoukankan      html  css  js  c++  java
  • 一点一点学写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遍历的核心代码如下:

    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... 
  • 相关阅读:
    关于display:flex
    关于兼容性——百分比对于IE浏览器的影响
    谈谈一个菜鸟写了一段时间的静态页面
    2016.01.02
    课时21:函数:lambda表达式
    课时20:内嵌函数和闭包
    课时19:函数:我的地盘听我的
    课时18:函数:灵活即强大
    课时17:函数:Python的乐高积木
    课时16:序列
  • 原文地址:https://www.cnblogs.com/catgatp/p/6527251.html
Copyright © 2011-2022 走看看