多文件夹下的Makefile自动编译

原创 2015年07月07日 10:25:11

  很多时候我们可能会遇到这样的情况:要编译多个目录下的代码,然后要将中间文件和执行文件分别放到不同的文件夹下面。好吧,贴图的排版第一次用,将就看一下。下面的图是我练习用的一个项目文件结构图。其中bin用来存放最后生成的可执行文件,f1,f2分别是用到的两个模块(函数),而且两个文件夹下分别对应自己的Makefile编译文件,include包含的是头文件,main.c包含的是主函数,其对应文件夹下也有一个Makefile文件,而obj是用来存放中间文件。然后是根目录下有一个全局的Makefile编译文件。

  我们通过在根目录下,键入make,系统会自动到main,f1,f2文件夹下去编译文件,最后将生成的可执行文件放到myapp下面。

  下面我从根目录开始,重新回忆并记录下实现的过程。首先看下根目录下的Makefile。

#设置编译器
CC=gcc

#参考资料http://www.cnblogs.com/Shirlies/p/4282182.html
#debug文件夹里的makefile文件需要最后执行,
#所以这里需要执行的子目录要排除debug文件夹,
#这里使用awk排除了debug文件夹,读取剩下的文件夹
#SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "cur_dir") print $$9}')

SUBDIRS=f1 \
		f2 \
		main \
		obj 
OBJS=f1.o f2.o main.o
#最终bin文件的名字,可以更改为自己需要的
BIN=myapp
#bin文件所在的目录
BIN_DIR=bin
#目标文件所在的目录
OBJS_DIR=obj
#记住当前工程的根目录路径ROOT_DIR=$(shell pwd)
#获取当前目录下的c文件集,放在变量CUR_SOURCE中CUR_SOURCE=${wildcard *.c}
#将对应的c文件名转为o文件后放在下面的CUR_OBJS变量中CUR_OBJS=${patsubst %.c, %.o, $(CUR_SOURCE)}

#将以下变量导出到子shell中,本次相当于导出到子目录下的makefile中
export CC OBJS BIN OBJS_DIR BIN_DIR

#注意这里的顺序,需要先执行CHECK_DIR最后才能是SUBDIRS
all:CHECK_DIR $(SUBDIRS)

CHECK_DIR:
#mkdir -p 可以一次生成多级目录
	mkdir -p $(BIN_DIR)
#递归执行子目录下的makefile文件,这是递归执行的关键
$(SUBDIRS):ECHO
	#直接去根目录下的其他目录下执行子makefile文件
	make -C $@
	
ECHO:
	#将c文件编译为o文件,并放在指定放置目标文件的目录中即OBJS_DIR
	@echo $(SUBDIRS)
	@echo begin compile

#将c文件编译为o文件,并放在指定放置目标文件的目录中即OBJS_DIR
#$(CUR_OBJS):%.o:%.c
#    $(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@
clean:
	@$(RM) $(OBJS_DIR)/*.o
	@rm -rf $(BIN_DIR)
  f1文件夹下面的f1.c和Makefile分别如下:

  f1.c如下:

#include "../include/myinclude.h"


void print_f1()
{
	printf("Message from f1.c\n");
}
  Makefile如下:
../$(OBJS_DIR)/f1.o:f1.c
	$(CC) -c $^ -o $@ 

#OBJS=f1.o f2.o main.o
#$@  表示规则中的目标文件集。
#$^ 所有的依赖目标的集合
  f2文件夹下类似:

  f2.c如下:

#include "../include/myinclude.h"


void print_f2()
{
	printf("Message from f2.c\n");
}
  Makefile如下:
../$(OBJS_DIR)/f2.o:f2.c
	$(CC) -c $^ -o $@

  include文件夹下面的头文件include.h如下:
#ifndef _MY_INCLUDE_H_
#define _MY_INCLUDE_H_


#include <stdio.h>

#endif

  main文件夹下面的文件.

  main.c如下:

#include <stdio.h>

int main()
{
	print_f1();
	print_f2();

	return 0;
}

 Makefile如下:
../$(OBJS_DIR)/main.o:main.c
	$(CC) -c $^ -o $@

  感觉根据学过的一些shell命令,还是可以看懂整个流程,不过说实在的,要是真正让我写的话,我还是写不出来,只能对照着例子来写。不过我想这样子的程序应该就够了,毕竟用的时候是可以查找资料的。模仿的功力还是得学的~~



版权声明:本文为博主原创文章,未经博主允许不得转载。

makefile自动化编译

大神博客链接: http://blog.csdn.net/haoel/article/details/2886 makefile的格式: 目标文件 :依赖 target… : prere...
  • qq_40477151
  • qq_40477151
  • 2018年01月07日 17:16
  • 30

Makefile之编译多个可执行程序

1.写在前面最近弄Linux编程,自己写Makefile编译代码。产生了2个需求:1.一个Makefile编译链接多个.c或.cpp文件,生成多个可执行程序;2.一个Makefile编译链接多个.c或...
  • ab455373162
  • ab455373162
  • 2016年11月27日 11:34
  • 1544

gcc编译多个文件与makefile应用

zz : http://huobumingbai.blog.51cto.com/1196746/308526 (本文主要以gcc为演示,如果是C++程序直接将给 gcc改为g...
  • sxlwzl
  • sxlwzl
  • 2014年06月01日 18:48
  • 1142

编译多个目录源码的Makefile写法

文件组织如下: --Makefile --src目录 --main.cpp --func.cpp --func.h --head目录 --head.cpp --head.h --obj目录 Mak...
  • chinachenyadong
  • chinachenyadong
  • 2015年04月24日 00:57
  • 3396

Makefile编译多个可执行文件

简单实例: CC = gcc CXX = g++ CFLAGS = -O -DDBG -D_REENTRANT -Wall -DUSE_PTHREAD -pthread LDFLAGS = -ld...
  • chinabhlt
  • chinabhlt
  • 2015年11月11日 15:38
  • 2358

Linux学习笔记——例说makefile 多个文件

0.前言     从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借...
  • xukai871105
  • xukai871105
  • 2014年07月02日 21:26
  • 8724

Makefile自动生成依赖文件,并自动编译

因为经常要用到makefile编译,每次都为头文件的依赖关系头痛,所以这次费了两天时间开发了一个通用的makefile,它可以自动生成依赖文件,并编译,当然你要按文件里面的说明来填充一些中间文件名. ...
  • zhuangtim1987
  • zhuangtim1987
  • 2014年05月16日 23:15
  • 950

两个简单的makefile的实现,编译当前目录下所有的.c文件

在网上找到的一个非常好的makefile文件,可以编译本文件夹下的所有.c文件,之需要定义输出文件名,不需要指定main文件的文件名,非常的好,非常的方便,注释也很详细,收藏并分享给需要的人。 ###...
  • andylauren
  • andylauren
  • 2016年11月18日 22:02
  • 1991

Makefile参考样例3:多个文件夹.c的编译

这是一个makefile的范例,用于编译多文件夹,多文件的编译; 代码简洁,容易解理,能自动检查头文件依赖关系,支持不同文件夹下面有相同的文件名的.c文件;...
  • qq446252221
  • qq446252221
  • 2017年03月24日 10:37
  • 248

Linux下多文件夹编写Makefile详解

-Werror     @Take warning as error handling  子目录下面的Makefile编写是最简单的,最重要的是编写顶层目录下的Makefile和Make...
  • qq_21792169
  • qq_21792169
  • 2016年01月02日 16:20
  • 17909
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多文件夹下的Makefile自动编译
举报原因:
原因补充:

(最多只允许输入30个字)