时候,我们在开发的时候需要将本次工程的代码分成多个子目录来编写,但是在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. // src/test1/test1.cpp
  7. #include "test1.h"
  8. int test1() {
  9. return 1;
  10. }
  11. <pre name="code" class="cpp">//  src/test2/test2.h
  12. #ifndef __TEST2_H__
  13. #define __TEST2_H__
  14. int test2();
  15. #endif //__TEST2_H__
  16. // src/test2/test2.cpp
  17. #include "test2.h"
  18. int test2() {
  19. return 2;
  20. }
  1. //  src/test3/test3.h
  2. #ifndef __TEST3_H__
  3. #define __TEST3_H__
  4. int test3();
  5. #endif //__TEST3_H__
  6. // src/test3/test3.cpp
  7. #include "test3.h"
  8. int test3() {
  9. return 3;
  10. }

// 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. SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
  5. SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc))
  6. SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))
  7. OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP))
  8. OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC))
  9. OBJS_C = $(patsubst %.c, %.o, $(SRCS_C))

下面是Makefile的全部文件

一点一点学写Makefile(6)-遍历当前目录源文件及其子目录下源文件的更多相关文章

  1. 一点一点学写Makefile(3)-增加第三方库和头文件

    我们在写代码的时候不一定都是有自己来完成,一个工程中会大量使用一些比较优秀的动态库.静态库等,我们在使用这些库完成所有的代码后,需要在编译的时候将这些库使用的头文件添加到我们的工程上,将他的库文件也添 ...

  2. 一点一点学写Makefile(2)-自动搜所当前目录下的所有源文件

    上个博客我们使用的是笨方法添加源文件,本次我要实现的是遍历文件夹来获得所有的cpp文件 //makefile CROSS = CC = $(CROSS)gcc CXX = $(CROSS)g++ DE ...

  3. 一点一点学写Makefile(4) - 编译时指定宏参数

    我们在项目中有时为了方便会自定义一些与项目无关的功能,例如打印输出一些提示信息.将关键协议生成文件等,但是如果每次都通过修改代码的方法来实现,测试部门就会认为你改的这些代码可能会带来其他问题.对于这种 ...

  4. 一点一点学写Makefile(5)-获取文件所在路径

    我们在开发一套代码时,应该保证工程放到任何一个目录中均可以编译成功,但是有时候链接库的时候会造成编译错误,本次就会告诉大家如何动态的获得工程所在的绝对路径 代码下载目录 选择Makefile-5 // ...

  5. C# 遍历文件夹及子目录下所有图片.

    要求:取指定目录下面的所有图片,以表格的型式展示并显示该图片的相对路径. 服务端代码: public partial class ViewIcon : System.Web.UI.Page { JAr ...

  6. 查找当前目录和所有子目录下的后缀名为.o的文件,删除之

    查找: find . -name "*.o" -exec ls {} \; 删除: find . -name "*.o" -exec rm -f {} \;

  7. python 列出出当前目录及所有子目录下的文件

    [root@web1 test]# cat walk.py #!/usr/bin/python # -*- coding: UTF-8 -*- import os for root, dirs, fi ...

  8. 一点一点学写Makefile-1

    相信很多Linux开发者 都得自己来写Makefile,刚开始学习学写这个的时候都会碰到很多困难,我之前没有自己独立完成过Makefile,都是在公司已有的模板上添加.现在突然有一个很大的想法就是从零 ...

  9. 一点一点学ASP.NET系列

    转自:http://www.cnblogs.com/stwyhm/archive/2006/08/10/473075.html 做开发近两年了,自认为自己还算是个知道要上进的人,每天不停地学习,不停地 ...

随机推荐

  1. Valgrind 检测程序内存使用

    Valgrind是用于构建动态分析工具的探测框架.它包括一个工具集,每个工具执行某种类型的调试.分析或类似的任务,以帮助完善你的程序.Valgrind的架构是模块化的,所以可以容易地创建新的工具而又不 ...

  2. 腾讯云(Linux)安装.net core sdk2.1、net core runtime2.1

    按照微软指令安装: sdk2.1:https://www.microsoft.com/net/download/linux-package-manager/centos/sdk-current 1. ...

  3. maven的resources插件

    <build><sourceDirectory>src/jvm</sourceDirectory> <testSourceDirectory>test/ ...

  4. VUE 入门教程

    http://www.runoob.com/w3cnote/vue-js-quickstart.html VUE安装教程 https://segmentfault.com/a/119000001218 ...

  5. Oracle 查看表结构视图

    -- 创建视图 CREATE VIEW VIEW_TABLEASSELECT A.TABLE_NAME, A.column_name 字段名,A.data_type 数据类型,A.data_lengt ...

  6. VUE--mixins的一些理解。

    概念:混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 用法: 1.创建混 ...

  7. 自动化交互expect

    自动化交互expect 一,介绍 每次服务器控制链接都需要输入密码,很麻烦,每次交互大大延长了时间 因此就有了免交互及自动化交互存在expect 二,安装 yum install expect -y ...

  8. springboot项目中引用其他springboot项目jar

    1. 剔除要引入的springboot项目中不需要的文件:如Application和ApplicationTests等 2.打包 不能使用springboot项目自带的打包插件进行打包: 3.打包 4 ...

  9. 图解DTS和PTS

    由于把视频编码成I,B,P等帧,如下图   假设现在有I,B,P帧,那么要传输和显示呢??   如果按照显示顺序传输的话: 传输顺序就是I->B>P 当对B帧进行解码后,由于B帧无法单独显 ...

  10. 图解 I帧,B帧以及P帧

    I‑frame (Intra-coded picture): 即完整的一张图片 P‑frame (Predicted picture): 与前面一张图片的区别的区域 B‑frame (Bidirect ...