多个Makefile文件编译,Makefile多目标编译和多层次编译
多个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多目标编译和多层次编译相关推荐
- Makefile文件:Makefile介绍
本文介绍Makefile的一些基本概念以及简单的用法.本文所用的编译器是Hightec tricore v4.9.1.0. 文章目录 1 Makefile的作用 2 Makefile的规则 3 一个简 ...
- 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则
1. 目标文件搜索(VPATH和vpath) 如果需要的文件是存在于不同的路径下(即源文件与 Makefile 文件不在同一个路径下),在编译的时候就用到了 Makefile 中为我们提供的目录搜索文 ...
- Makefile文件的编写规则
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...
- 【Linux】Makefile文件
Makefile文件 1. Makefile定义 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译 ...
- C语言makefile文件详解,makefile讲解
仅供自己学习使用 一.Makefile介绍 Makefile 或 makefile: 告诉make维护一个大型程序, 该做什么.Makefile说明了组成程序的各模块间的相互 关系及更新模块时必须进行 ...
- makefile 文件 ( http://blog.csdn.net/ruglcc/article/details/7814546/ )
makefile三要素:目标,依赖,命令 make -f makefilename 指定makefile文件 (makefile写多行命令时,使用换行符"\") 一.makef ...
- Linux内核Makefile文件
Linux内核Makefile文件(翻译自内 核手册) 转载自:http://blog.chinaunix.net/uid-21651676-id-60377.html Linux 内核Makefil ...
- 编写Makefile文件
续GCC编译器 1.编写Makefile UNIX系统上很多软件包都是使用make程序和Makefile文件来实现自动编译的,make程序的目的就是自动确定一个软件包的哪些部分需要重新编译,并用特定的 ...
- 教会你如何编写makefile文件
最近一直在学习makefile是如何编写的. 当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令 ...
- Make命令与Makefile文件
Make命令 使用Make命令只会在必要时重新编译所有受改动影响的源文件.而不会因为只改动了一个文件而重新编译整个项目. Make命令不仅仅用于编译程序,无论何时,当需要通过多个输入文件来生成输出文件 ...
最新文章
- java继承类大全_Java 面向对象继承部分(示例代码)
- 【技术系列】浅谈GPU虚拟化技术(第一章)
- 为什么 MySQL 使用 B+ 树,而不是 B 树或者 Hash?
- android的armeabi和armeabi-v7a
- php的json_encode实例,php json_encode()函数返回json数据实例代码
- JAVA_Thread_deadlock
- 如何用Pygame写游戏(七)
- React中useEffect使用
- 流式计算storm应用场景简介
- 在Linux(Ubuntu)下编写编译C语言
- 安装 composer 并启动 yii2 项目
- 从技术原理洞悉摄像头破解及防范
- 计算机桌面提示区,win7如何把电脑桌面分成四个区域?电脑分区域显示方法
- 2021-2027全球与中国DJ设备市场现状及未来发展趋势
- LoadRunner性能测试实战视频教程下载
- CSS模块、筛选模块、文档处理(CUD)模块、事件模块
- JavaScrpt LRC歌词同步 和 es6 的 fetch 的 async/await 和 promise 两种写法
- light-bot小游戏
- 感谢时光让我在最美的年纪遇到你
- ftp 文件夹 上传到服务器,ftp上传文件夹到服务器 远程路径