关闭

多级目录makefile例子

960人阅读 评论(0) 收藏 举报
分类:

先看一下make前后的目录结构对比

   

makefile会自动生成需要的文件夹:各个模块下src目录下的obj、target目录

各个模块下src/obj负责存放生成的 .o 文件;

target用于存储生成的可执行文件;

lib用于存储生成的静态库(libModuleA.a)和引用的静态库文件(libtest.a);

include文件夹用于存储引用库的头文件(test.h);

module_a模块会生成一个静态库,在生成可执行文件时链接这个静态库。

a.c中是一个函数实现,a.h中声明,main.c中调用。

main函数会调用module_a生成静态库中的函数和引用库中的函数;

以下是各级makefile的实现。

最外层makefile实现:

#最外层的makefile负责创建相关目录和进入每个子目录去make

#后边里目录要根据前面一个的目录为基准
SUBDIRS = ./module_a ../main

.PHONY:all
all:
	mkdir -p ./target
	mkdir -p ./module_a/src/obj
	mkdir -p ./main/src/obj
	
	@list='$(SUBDIRS)';for subdir in $$list; do \
		cd $$subdir && make; \
	done
	
.PHONY:clean
clean:
	@list='$(SUBDIRS)'; for subdir in $$list; do \
		echo "Clean in $$subdir";\
		cd $$subdir && make clean;\
	done
	rm -rf ./target

module_a目录下makefile实现:

CC := gcc
CFLAGS := -fPIC

INC_DIR := ./inc
SRC_DIR := ./src
OBJ_DIR := $(SRC_DIR)/obj

INSTALL_LIB_PATH := ../lib
LIB_TARGET := libmoduleA.a

#包含需要的头文件路径
CFLAGS += -I$(INC_DIR)

#搜索指定目录下的所有以.c结尾的文件(搜索结果保存在SOURCE,结果中包含路径相关信息)
SOURCE = $(wildcard $(SRC_DIR)/*.c)
#去除结果中的路径信息
SOURCER = $(notdir $(SOURCE))
#把.c换成.o
OBJS = $(patsubst %.c,%.o,$(SOURCER))

#把所有.o加上想要的路径信息
OBJS := $(foreach X,$(OBJS),$(OBJ_DIR)/$(X))
#OBJS := $(OBJ_DIR)/*.o
#OBJS := $(OBJ_DIR)/a.o \
#	$(OBJ_DIR)/main.o
#OBJS := $(foreach x,$(OBJS),$(x).o)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
	$(CC) $(CFLAGS) -c -o $@ $<

#$(TARGET):$(OBJS)
#	$(CC) $(CFLAGS) -o $(TARGET_DIR)/$@ $(OBJS)
#用.o生成静态库文件.a,并放到指定目录下
$(LIB_TARGET):$(OBJS)
	ar crus $(LIB_TARGET) $^
	install -m 0755 $(LIB_TARGET) $(INSTALL_LIB_PATH)
	rm -rf $(LIB_TARGET)

.PHONY:clean
clean:
	rm -rf $(OBJ_DIR)
	rm -rf $(INSTALL_LIB_PATH)/$(LIB_TARGET)
	

main目录下makefile实现:

CC := gcc
CFLAGS := -fPIC

INC_DIR := ../module_a/inc ../include
SRC_DIR := ./src
OBJ_DIR := $(SRC_DIR)/obj

TARGET_DIR := ../target
TARGET := main
INSTALL_LIB_PATH := ../lib

#包含所有以.a结尾的文件
LIB_TARGET := *.a

CFLAGS += -I$(INC_DIR)

SOURCE = $(wildcard $(SRC_DIR)/*.c)
SOURCER = $(notdir $(SOURCE))
OBJS = $(patsubst %.c,%.o,$(SOURCER))
OBJS := $(foreach X,$(OBJS),$(OBJ_DIR)/$(X))

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
	$(CC) $(CFLAGS) -c -o $@ $<

#生成可执行文件
$(TARGET):$(OBJS)
	$(CC) -o $(TARGET_DIR)/$(TARGET) $(OBJS) \
	$(INSTALL_LIB_PATH)/$(LIB_TARGET)

	@echo "------------------------ MAKEFILE COMPLETE -----------------------"


.PHONY:clean
clean:
	rm -rf $(OBJ_DIR)



0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

ESP8266学习笔记之makefile

开发前的准备 usb转TTL模块,或者单片机开发板,直接使用它的串口通讯引脚,用来烧录程序和进行串口信息打印; 从乐鑫官网下载ESP8266_NONOS_SDK,虽然官方有提供在linux下的开发平台,但是我还是推荐用安信可的IDE开发工具,它把make指令等都集成在ecli...
  • zhipun
  • zhipun
  • 2017-01-14 16:20
  • 1587

多级目录中的Makefile

以下示例演示了如何在多级目录下维护多个Makefile,以使每级目录都可单独支持'make'命令。   目录结构: [user@localhost maketest]$ tree . |-- Makefile ---Makefile 1 |-- su...
  • dragon101788
  • dragon101788
  • 2012-08-24 10:38
  • 2382

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

文件组织如下: --Makefile --src目录 --main.cpp --func.cpp --func.h --head目录 --head.cpp --head.h --obj目录 Makefile写法如下 DIR_OBJ = ./obj DIR_SRC = ./src SRC = $...
  • chinachenyadong
  • chinachenyadong
  • 2015-04-24 00:57
  • 3243

多层目录Makefile

今天结合网上的一个例子,自己写了一个可适用于多层目录的Makefile。 ARCH= armv5l-linux- CC= $(ARCH)gcc LD = $(ARCH)ld AS = $(ARCH)as CPP = $(ARCH)g++ AR = $(ARCH)ar ...
  • ubuntulover
  • ubuntulover
  • 2014-02-18 16:35
  • 1861

一个适用于层级目录结构的makefile模版

 今天 写了个层次化的Makefile模版,用来自动化编译项目,这个模版应当包含以下功能: 适用于层次化结构,Makefile主要内容都放在顶层目录下的Makefile.env中,子层Makefile包含这个Makefile.env,只要增加一些变量就可以编译,特别方便添加新的功能模块自...
  • HMSIWTV
  • HMSIWTV
  • 2014-03-10 10:48
  • 11806

多目录下多文件 makefile编写

前面已经分享了单目录项下多文件的makefile的编写,现在来看看多目录下多文件makefile的编写;         在做项目时,一般文件都会分几个目录来存放;基本的是  include/  bin/ src/ obj/ lib/ to...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2015-04-01 17:40
  • 3638

Linux下多目录的Makefile编写

手头一个项目,需要编写项目的makefile 多目录结构: csource/   ├── common │   └── sqlite3 ├── inc │   ├── curl │   ├── lua │ &#...
  • haolipengzhanshen
  • haolipengzhanshen
  • 2016-02-28 13:44
  • 463

多个目录编译的makefile的编写

多个目录编译的makefile的编写  6-11  Web开发  Dante  13,249 最近工作忙的要死,明明积压了一大堆博文要写,结果却始终没有时间,也沉静不下心情来写。不过知识这种...
  • USBdrivers
  • USBdrivers
  • 2014-05-26 19:44
  • 733

makefile 多级目录如何编写

all: myapp mylib.a #Which compiler CC=gcc #Where to install INSTDIR=/usr/local/bin #Where are include files kept INCLUDE=. ...
  • xiaocao9903
  • xiaocao9903
  • 2014-07-31 18:03
  • 483

多目录时Makefile 的编写方法

多目录时Makefile 的编写方法1 make分中预定义变量表 $* 不包含扩展名的目标文件名称。 $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。 $< 第一个依赖文件的名称。 $?...
  • guoxiaojie_415
  • guoxiaojie_415
  • 2016-08-14 20:20
  • 3116
    个人资料
    • 访问:3471次
    • 积分:83
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:6篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档