多个Makefile文件编译,Makefile多目标编译和多层次编译

  • README
  • Makefile多目标编译
  • Makefile多层次编译
    • a文件夹
    • b文件夹
    • include文件夹
    • obj文件夹
  • 多个Makefile文件编译
  • 相关截图
    • make文件夹
    • a_b文件夹
    • project2文件夹

README

文件夹以及文件说明。
根文件夹为make,实现多个Makefile文件编译。

Dir
make-----                                   /* 一级文件夹:多Makefile编译 */|                 |-------a_b                         /* 二级文件夹:多目标编译 */|       ||      |-------obj                 /* 三级文件夹:a_b工程目标文件生成的指定位置 */|        ||      |------------------main_a.c /* 第一个目标主文件 */|     |------------------main_b.c /* 第二个目标主文件 */|     |------------------test_a.c /* 第一个目标printf功能函数文件 */|        |------------------test_b.c /* 第二个目标printf功能函数文件 */|        |------------------test_a.h /* 第一个目标功能函数声明头文件 */|       |------------------test_b.h /* 第二个目标功能函数声明头文件 */|       |------------------Makefile /* 二级文件夹a_b多目标编译的Makefile文件 */||-------projects                 /* 二级文件夹:多层次编译 */|       ||      |-------a                   /* 三级文件夹:a功能函数实现 */|     |       ||      |       |----------a.c      /* a()功能函数实现 */|        |       |----------a.h      /* a()功能函数声明头文件 */|     |       |       |-------b                   /* 三级文件夹: b功能函数实现 */|        |       ||      |       |----------b.c      /* b()功能函数实现 */|        |       |----------b.h      /* b()功能函数声明头文件 */|     |       |       |-------include             /* 三级文件夹:相关常量宏定义头文件 */|      |       |   |       |       |----------code.h   /* 相关常量宏定义头文件 */|       ||      |-------obj                 /* 三级文件夹:project2工程目标文件生成的指定位置 */|       |       |       |-------c.c                 /* c()功能函数实现 */|        |-------c.h                 /* c()功能函数声明头文件 */|     |-------main.c              /* project2工程实现主函数,调用a(),b(),c()函数接口 */|     |-------Makefile            /* project2工程实现多层次编译的Makefile */|       ||-------Makefile                   /* make文件夹实现多个Makefile文件编译,即调用projects和a_b文件夹下Makefile编译 */!!!
注意:
所有非 main*.c 文件只具有简单的printf功能
所有含有 main*.c 文件只有简单的函数接口调用功能

Makefile多目标编译

在文件夹a_b中实现。
main_a.c: 第一个目标主文件

#include <stdio.h>
#include <stdlib.h>
#include <test_a.h>int main() {print_a();return 0;}

test_a.c:第一个目标printf功能函数文件

#include <test_a.h>void print_a() {printf( "This is test_a.c!\n" );}

test_a.h:第一个目标功能函数声明头文件

#ifndef _TEST_A_H
#define _TEST_A_H#include <stdio.h>
#include <stdlib.h>void print_a();#endif

main_b.c:第二个目标主文件

#include <stdio.h>
#include <stdlib.h>
#include <test_b.h>int main() {print_b();return 0;}

test_b.c:第二个目标printf功能函数文件

#include <test_b.h>void print_b() {printf( "This is test_b.c!\n" );}

test_b.h:第二个目标功能函数声明头文件

#ifndef _TEST_B_H
#define _TEST_B_H#include <stdio.h>
#include <stdlib.h>void print_b();#endif

Makefile:二级文件夹a_b多目标编译的Makefile文件

CC       = gcc
CFLAGS   = -lm -Wall -g#get the posotion of current directory
ROOT     = $(PWD)
#get the posotion of current library
INCLUDE  = -I$(ROOT)
APP      = $(ROOT)/obj#all the out files of first target
OBJS1    = main_a.o \test_a.o#all the out files of second target
OBJS2    = main_b.o \test_b.o #first and second target
TARGETS1 = $(APP)/main_a
TARGETS2 = $(APP)/main_b
#total tagets
TARGETS  = $(TARGETS1)
TARGETS += $(TARGETS2)
#include the path of library
CFLAGS  += $(INCLUDE)OBJS     = $(OBJS1)
OBJS    += $(OBJS2)all:$(TARGETS)$(TARGETS1):$(OBJS1)$(CC) -o $(TARGETS1) $(OBJS1) $(CFLAGS)$(TARGETS2):$(OBJS2)$(CC) -o $(TARGETS2) $(OBJS2) $(CFLAGS)clean:-$(RM) $(OBJS) -$(RM) $(TARGETS)

Makefile多层次编译

Makefile文件


ROOT    = $(PWD)A       = $(ROOT)/a
B       = $(ROOT)/b
INCLUDE = $(ROOT)/include
APP     = $(ROOT)/objCFLAGS  = -I$(A)
CFLAGS += -I$(B)
CFLAGS += -I$(ROOT)
CFLAGS += -I$(INCLUDE)OBJS    = main.o $(A)/a.o $(B)/b.o c.o TARGET  = $(APP)/appall:$(TARGET)$(TARGET):$(OBJS)$(CC) -o $(TARGET) $(OBJS) $(CFLAGS)clean:-$(RM) $(OBJS)-$(RM) $(TARGET)

c.c:c()功能函数实现

#include <stdio.h>
#include <stdlib.h>
#include <c.h>
#include <code.h>void c(){printf( "%d: This is c function!\n" , C );}

c.h:c()功能函数声明头文件

#include<stdio.h>
void c();

main.c:project2工程实现主函数,调用a(),b(),c()函数接口

#include <stdio.h>
#include "a.h"
#include "b.h"
#include "c.h"void main(){a();}

a文件夹

三级文件夹: a功能函数实现
a.c:a()功能函数实现

#include <stdio.h>
#include <stdlib.h>
#include "a.h"
#include "b.h"
#include "c.h"
#include <code.h>void a(){c();b();printf( "%d: This is a function!\n" , A );printf( "Well done!\n" );}

a.h:a()功能函数声明头文件

void a();

b文件夹

三级文件夹: b功能函数实现
b.c:b()功能函数实现

#include <stdio.h>
#include <stdlib.h>
#include "b.h"
#include <code.h>void b(){printf( "%d: This is b function!\n" , B );}

b.h:b()功能函数声明头文件

#include <stdio.h>void b();

include文件夹

code.h:相关常量宏定义头文件

#include <stdio.h>
#include <stdlib.h>#define A 1
#define B 2
#define C 3

obj文件夹

编译前为空文件夹,编译时为project2工程目标文件生成的指定位置

多个Makefile文件编译

Makefile:位于根文件夹make中

ROOT    = $(PWD)
SUBDIR  = $(ROOT)/a_b
SUBDIR += $(ROOT)/project2define make_subdir
@for i in $(SUBDIR); do   \( cd $$i && make $1 ) \
done;
endefALL: $(call make_subdir)clean:$(call make_subdir , clean)

相关截图

make文件夹

a_b文件夹

project2文件夹


/project2/a 文件夹

/project2/b 文件夹

/project2/include 文件夹

/project2/obj 文件夹

多个Makefile文件编译,Makefile多目标编译和多层次编译相关推荐

  1. Makefile文件:Makefile介绍

    本文介绍Makefile的一些基本概念以及简单的用法.本文所用的编译器是Hightec tricore v4.9.1.0. 文章目录 1 Makefile的作用 2 Makefile的规则 3 一个简 ...

  2. 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则

    1. 目标文件搜索(VPATH和vpath) 如果需要的文件是存在于不同的路径下(即源文件与 Makefile 文件不在同一个路径下),在编译的时候就用到了 Makefile 中为我们提供的目录搜索文 ...

  3. Makefile文件的编写规则

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...

  4. 【Linux】Makefile文件

    Makefile文件 1. Makefile定义 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译 ...

  5. C语言makefile文件详解,makefile讲解

    仅供自己学习使用 一.Makefile介绍 Makefile 或 makefile: 告诉make维护一个大型程序, 该做什么.Makefile说明了组成程序的各模块间的相互 关系及更新模块时必须进行 ...

  6. makefile 文件 (​ http://blog.csdn.net/ruglcc/article/details/7814546/ )

    makefile三要素:目标,依赖,命令 make -f makefilename   指定makefile文件 (makefile写多行命令时,使用换行符"\") 一.makef ...

  7. Linux内核Makefile文件

    Linux内核Makefile文件(翻译自内 核手册) 转载自:http://blog.chinaunix.net/uid-21651676-id-60377.html Linux 内核Makefil ...

  8. 编写Makefile文件

    续GCC编译器 1.编写Makefile UNIX系统上很多软件包都是使用make程序和Makefile文件来实现自动编译的,make程序的目的就是自动确定一个软件包的哪些部分需要重新编译,并用特定的 ...

  9. 教会你如何编写makefile文件

    最近一直在学习makefile是如何编写的.     当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令 ...

  10. Make命令与Makefile文件

    Make命令 使用Make命令只会在必要时重新编译所有受改动影响的源文件.而不会因为只改动了一个文件而重新编译整个项目. Make命令不仅仅用于编译程序,无论何时,当需要通过多个输入文件来生成输出文件 ...

最新文章

  1. java继承类大全_Java 面向对象继承部分(示例代码)
  2. 【技术系列】浅谈GPU虚拟化技术(第一章)
  3. 为什么 MySQL 使用 B+ 树,而不是 B 树或者 Hash?
  4. android的armeabi和armeabi-v7a
  5. php的json_encode实例,php json_encode()函数返回json数据实例代码
  6. JAVA_Thread_deadlock
  7. 如何用Pygame写游戏(七)
  8. React中useEffect使用
  9. 流式计算storm应用场景简介
  10. 在Linux(Ubuntu)下编写编译C语言
  11. 安装 composer 并启动 yii2 项目
  12. 从技术原理洞悉摄像头破解及防范
  13. 计算机桌面提示区,win7如何把电脑桌面分成四个区域?电脑分区域显示方法
  14. 2021-2027全球与中国DJ设备市场现状及未来发展趋势
  15. LoadRunner性能测试实战视频教程下载
  16. CSS模块、筛选模块、文档处理(CUD)模块、事件模块
  17. JavaScrpt LRC歌词同步 和 es6 的 fetch 的 async/await 和 promise 两种写法
  18. light-bot小游戏
  19. 感谢时光让我在最美的年纪遇到你
  20. ftp 文件夹 上传到服务器,ftp上传文件夹到服务器 远程路径

热门文章

  1. 点赋科技:淘宝关键词搜索不到是什么原因?
  2. GTX/GTH的使用心得
  3. Mac电脑把位图转换成矢量图的软件
  4. python 3 中的 os 以及 os.path 模块的使用详解!阿波的博客
  5. 9月数学建模国赛,报名组队与【近10年赛题知识点趋势】
  6. react中背景图片和图片引入的方法
  7. [算法系列]优先队列,堆与堆排序
  8. Python学习笔记-文件,CSV,序列化反序列化及应用
  9. 构建“量子世界观”的基本概念
  10. typora笔记去除英文红色下划线