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

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 #选择编译器为gcc
CFLAGS   = -lm -Wall -g

#获取项目根路径
ROOT     = $(PWD)
#获取当前库函数根路径
INCLUDE  = -I$(ROOT)
#设置目标生成路径
APP      = $(ROOT)/obj

#第一目标生成内容
OBJS1    = main_a.o \
	       test_a.o

#第二目标生成内容
OBJS2    = main_b.o \
	       test_b.o 

#第一与第二目标输出名字
TARGETS1 = $(APP)/main_a
TARGETS2 = $(APP)/main_b
#最终目标汇总
TARGETS  = $(TARGETS1)
TARGETS += $(TARGETS2)
#库函数路径汇总
CFLAGS 	+= $(INCLUDE)

# 生成目标汇总(包含中间生成的临时目标)
OBJS     = $(OBJS1)
OBJS    += $(OBJS2)

all:$(TARGETS)

#目标1自动编译,包括编译依赖关系自动索引
$(TARGETS1):$(OBJS1)
	$(CC) -o $(TARGETS1) $(OBJS1) $(CFLAGS)

#目标2自动编译,包括编译依赖关系自动索引
$(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)/obj

CFLAGS  = -I$(A) 
CFLAGS += -I$(B) 
CFLAGS += -I$(ROOT) 
CFLAGS += -I$(INCLUDE)

OBJS    = main.o $(A)/a.o $(B)/b.o c.o 

TARGET  = $(APP)/app

all:$(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)/project2

define make_subdir
@for i in $(SUBDIR); do   \
	( cd $$i && make $1 ) \
done;
endef

ALL: 
	$(call make_subdir)

clean:
	$(call make_subdir , clean)

相关截图

make文件夹

make文件夹

a_b文件夹

a_b文件夹

project2文件夹

project2文件夹
/project2/a 文件夹
/project2/a文件夹
/project2/b 文件夹
/project2/b文件夹
/project2/include 文件夹
/project2/include文件夹
/project2/obj 文件夹
/project2/obj文件夹

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值