一个Makefile
来源:互联网 发布:手机注册界面html源码 编辑:程序博客网 时间:2024/05/17 08:13
一个Makefile
开始学习Makefile决定怒艹之
从简单到难,从复杂到简易
此Makefile特点:
小巧简单,适合多目录,多嵌套目录 .
产生o文件及其它文件到指定目录中,使源文件目录不受“污染”
如果你的工程目录跟此并不是一致,大多数情况应该可以做少量修改就可以使用
如果有朋友对此有好的建议,非常欢迎。
目录结构为:
--test
--bin
--a.out
--depend
--add.d
--main.d
--lib
--add.c
--add.h
--Makefile
--main
- -main.c
--Makefile
--obj
--add.o
--main.o
--Makefile
说明:黑色加粗字体表示文件夹 . 蓝色字体表示文件
下面分别顺序说明主目录中的Makefile和子目录中的Makefile写法
1.主目录下的Makefile内容为:
#工程设置 分别是顶层目录 最终结果目录,OBJ文件目录,依赖文件depend目录,
#头文件搜索路径选项,编译器选项,编译器
export TOPDIR = $(CURDIR)
export BINDIR = $(TOPDIR)/bin
export OBJDIR = $(TOPDIR)/obj
export DEPENDDIR = $(TOPDIR)/depend
INCLUDE = -I. -I$(TOPDIR)/lib
export CFLAGS = -c $(INCLUDE)
export CC = gcc
######
#子目录 如果子目录很多可以用shell命令来动态赋值给SUBDIR
SUBDIR = main lib
#在OBJ目录下的o文件,这些文件是由SUBDIR产生的,这里最后将它们链接起来输出
#执行文件
OBJS = $(wildcard $(OBJDIR)/*.o)
#执行文件名称
BIN = $(BINDIR)/a.out
.PHONY : all subdir clean
all : subdir
subdir :
#依次遍历执行各个子目录中Makefile的all目标
$(foreach dir,$(SUBDIR),$(MAKE) -C $(dir) all;)
#调用link进行链接
$(MAKE) link
link :
$(CC) $(OBJS) -o $(BIN)
#依次遍历执行各个子目录中Makefile的clean目标进行清除
clean :
$(foreach dir,$(SUBDIR),$(MAKE) -C $(dir) clean;)
-rm $(OBJS) $(BIN)
2.子目录中的Makefile
其实子目录lib中与子目录main中的Makfile内容完全相同,因为它们都只是编译本文件夹中的源文件然后输出o文件到obj目录中,它们的执行思想是一致的。
内容如下:
SRCS = $(wildcard *.c) #所有的c源文件
#这样写后obj文件就会依赖于对应的源文件,如果obj文件没有对应的源文件新,那么#obj文件会重新产生
OBJS = $(addprefix $(OBJDIR)/,$(patsubst %.c,%.o,$(SRCS)))
#这样写后depend文件就会依赖于对应的源文件,如果当前depend文件没有对应的文件
#新,那么depend文件会重新产生
DEPS = $(addprefix $(DEPENDDIR)/,$(patsubst %.c,%.d,$(SRCS)))
.PHONY : all clean
all : $(OBJS)
#这里$(OBJDIR)/%.o 就等于$(OBJS),也就是目标all所依赖的文件,而当前obj目
#标又依赖于其对应的c文件通过对应的c文件就可以生成o文件
$(OBJDIR)/%.o : %.c
$(CC) $< $(CFLAGS) $(INCLUDE) -o $@
#这里的$(DEPENDDIR)/%.d 就等于$(DEPS),当前dep文件依赖于其对应的c文件
$(DEPENDDIR)/%.d : %.c
$(CC) $(CFLAGS) $(INCLUDE) -MM $< | sed -e 1's,^,$(OBJDIR)/,' > $@
#一定要加上这一句
#将生成的依赖关系文件引入到当前Makefile
#否则会出现依赖关系的文件更新后目标文件也不会更新
sinclude $(DEPS) #有了这一句后$(DEPENDDIR)/%.d 目标就会执行
clean :
-rm $(OBJS) $(DEPS)
- 一个Makefile
- 一个简单的Makefile
- 一个智能GNU makefile
- 一个通用的Makefile
- 一个makefile文件
- 一个通用的Makefile
- 一个Makefile的例子
- 一个Makefile的例子
- 一个简单的makefile
- 一个通用的Makefile
- 一个makefile的例子
- 一个简单的Makefile
- 自己动手写一个Makefile
- 一个简单的makefile
- 一个简单的Makefile
- 一个通用的Makefile
- 一个makefile实例
- 注释一个makefile
- 纯CSS实现的滑动的可折叠菜单
- 第一个博客
- JPA注解详解二
- CreateFile && CFile
- 在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出
- 一个Makefile
- JPA注解详解三
- kill 掉oracle用户的session
- 搜索引擎爬虫蜘蛛的UserAgent收集
- Ubuntu 中文编码设置
- js获取iframe中的内容 兼容火狐&&ie6
- F5
- 程序员在上海(6)
- CUDA开发环境搭建