博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Makefile 多目录自动编译
阅读量:6088 次
发布时间:2019-06-20

本文共 1781 字,大约阅读时间需要 5 分钟。

适用于多目录结构 C 工程自动编译。

makefile 分成三类: 

1. 工程根目录 makefile  : 这个makefile执行分成两个阶段

    a)递归进入每个子目录, 逐个执行子目录里面的 makefile ,将所有子目录里面生成的  .o 文件统一放在 /debug/obj (debug 子目录比较特殊 在第一阶段需要将这个子目录排除在外)

    b)执行 debug 子目录下面的 makefile 将第一阶段生成在 /debug/obj 里面的 .o 文件连接成可执行文件

2. 子目录 makefile : 每个源代码文件夹里面都必须包含此文件

    这个makefie 将把当前目录下面的所有 .c 源文件编译一遍 并将生成的 .o文件 放在 debug/obj 目录下

3. debug 目录 makefile : 这个 makefile 将debug/obj 里面的  .o 文件连接生成可执行文件 放在debug/bin 目录下

 

下面给出每类makefile的参考代码

1. 根目录 makefile 

  需要注意的是以下第 9 行的  CFLAG 变量 : 这个变量指定了编译条件 比如 -I$(ROOT_DIR)/common 指连接根目录下面的 common 文件夹 (参考gcc -I 选项),不然可能会编译报错缺少头文件,根据自己工程的目录结构可以在后面无限增加; -Wall 打开所有编译警告。

1 CC=gcc 2 SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "debug") print $$9}') 3 ROOT_DIR=$(shell pwd) 4 BIN=a.out 5 OBJS_DIR=debug/obj 6 BIN_DIR=debug/bin 7 CUR_SOURCE=${wildcard *.c} 8 CUR_OBJS=${patsubst %.c, %.o, $(CUR_SOURCE)} 9 CFLAG = -I$(ROOT_DIR)/common -I$(ROOT_DIR)src -Wall10 export CC BIN OBJS_DIR BIN_DIR ROOT_DIR CFLAG11 all:$(SUBDIRS) $(CUR_OBJS) DEBUG12 $(SUBDIRS):ECHO13     make -C $@14 DEBUG:ECHO15     make -C debug16 ECHO:17     @echo $(SUBDIRS)18 $(CUR_OBJS):%.o:%.c19     $(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@20 clean:21     @rm $(OBJS_DIR)/*.o22     @rm -rf $(BIN_DIR)/*

2. 子目录 makefile

1 SUBDIRS=$(shell ls -l | grep ^d | awk '{print $$9}') 2 CUR_SOURCE=${wildcard *.c} 3 CUR_OBJS=${patsubst %.c, %.o, $(CUR_SOURCE)} 4 all:$(SUBDIRS) $(CUR_OBJS) 5 $(SUBDIRS):ECHO 6     make -C $@ 7 $(CUR_OBJS):%.o:%.c 8     $(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@ $(CFLAG) 9 ECHO:10     @echo $(SUBDIRS)

3. debug 目录makefile

1 OBJS = *.o2 ODIR = obj3 $(ROOT_DIR)/$(BIN_DIR)/$(BIN):$(ODIR)/$(OBJS)4     $(CC) -o $@ $^

要看懂这个makefile 需要了解一定的makefile 语法基础,推荐参考 GUN_make中文手册

最后,如果发现错误,请批评指正,相互学习。

转载于:https://www.cnblogs.com/firemage/p/5174437.html

你可能感兴趣的文章
批量文件重命名工具
查看>>
简单说一下UWP中的JumpList
查看>>
unity将object[]或者string对象转换成枚举enum
查看>>
以太坊系列之六: p2p模块--以太坊源码学习
查看>>
使用scikit-learn解决文本多分类问题(附python演练)
查看>>
2018 年最值得关注的 JavaScript 趋势
查看>>
什么是区块链?超级账本 Brian Behlendorf 从五个方面教你认识
查看>>
Linux中的帮助功能
查看>>
针对Android的Pegasus恶意软件版本和针对iOS的有什么不同?
查看>>
全局探色器
查看>>
Hive Export和Import介绍及操作示例
查看>>
http://mongoexplorer.com/ 一个不错的 mongodb 客户端工具。。。
查看>>
Xcode 4.3 使用xcodebuild命令编译项目环境设置
查看>>
上传jar包到nexus私服
查看>>
Why Namespace? - 每天5分钟玩转 OpenStack(102)
查看>>
Project:如何分析项目中的资源分配情况
查看>>
HDU 4803 Poor Warehouse Keeper (贪心+避开精度)
查看>>
小错误汇总
查看>>
Spring源码系列 — Envoriment组件
查看>>
java正则表达式去除html标签,Java中正则表达式去除html标签
查看>>