多目录工程的 makefile 范例
2016-04-20 16:06
399 查看
参考:
http://blog.sina.com.cn/s/blog_449fafb90100y37u.html
下面就是我自己参考老大的技术写的针对多目录的makefile
我们要编译的工程是一个主目录proj, 它下面有4个子目录: /main /ui /math /obj
其中
main中包含文件 main.c
ui 中包含了文件 ui.h ui.c
math 中包含了文件 math.h math.c
obj 用于存放最终生成的目标
他们的关系是
main.c include “ui.h” “math.h”
ui.c include “ui.h” “math.h”
math.c include “math.h”
要求是在proj 目中的obj 目录中生成 out(主程序) ui.o main.o 以及一个动态库文件 libmath.so
第一种做法是在每一个子目录中都添加一个makefile文件, 当然主目录proj中的makefile必不可少,同时还在主目录中
创建一个env.mk文件,其作用就是包含了其他makefile都用到的模式规则
——————— env.mk—————————-
——————-proj/makefile ———————–
————- ui/makefile main/makefile —————-
—————— math/makefile ———————–
现在只要到proj主目录中,执行make all 命令就万事OK啦!!
http://blog.sina.com.cn/s/blog_449fafb90100y37u.html
下面就是我自己参考老大的技术写的针对多目录的makefile
我们要编译的工程是一个主目录proj, 它下面有4个子目录: /main /ui /math /obj
其中
main中包含文件 main.c
ui 中包含了文件 ui.h ui.c
math 中包含了文件 math.h math.c
obj 用于存放最终生成的目标
他们的关系是
main.c include “ui.h” “math.h”
ui.c include “ui.h” “math.h”
math.c include “math.h”
要求是在proj 目中的obj 目录中生成 out(主程序) ui.o main.o 以及一个动态库文件 libmath.so
第一种做法是在每一个子目录中都添加一个makefile文件, 当然主目录proj中的makefile必不可少,同时还在主目录中
创建一个env.mk文件,其作用就是包含了其他makefile都用到的模式规则
——————— env.mk—————————-
CC := gcc #头文件目录 INCLUDE_DIR := \ -I$(MAKEROOT)/ui \ -I$(MAKEROOT)/main\ -I$(MAKEROOT)/math CFLAGS := $(INCLUDE_DIR) #对所有的.o文件以.c文件创建它 %.o : %.c ${CC} ${CFLAGS} -c $< -o $(MAKEROOT)/obj/$@
——————-proj/makefile ———————–
export MAKEROOT := $(shell pwd) TARGET_DIRS := main \ ui \ math include ./env.mk define build_obj for SubDir in $(TARGET_DIRS); do \ echo "Building $$SubDir..."; \ make -C $$SubDir; \ done endef all: @$(call build_obj) #调用过程 gcc -fPIC -o ./bin/out ./obj/*.o ./obj/*.so #生成最终目标 clean : -rm ./obj/*.o ./out ./obj/*.so
————- ui/makefile main/makefile —————-
include $(MAKEROOT)/env.mk #包括头文件,执行模式规则 SRCS := $(wildcard *.c) OBJS := $(patsubst %.c,%.o,$(SRCS)) #生成所有.c文件对应的.o文件 .PHONY : all all : $(OBJS)
—————— math/makefile ———————–
.PHONY : all all : gcc -shared -o ../obj/libmath.so math.c math.h #生成动态库文件
现在只要到proj主目录中,执行make all 命令就万事OK啦!!
相关文章推荐
- Django 异常解决
- linux下 vim修改文件后如何保存
- [从头学数学] 第187节 仗剑题海载酒行(下)
- Android 一些鲜为人知的方法
- Error parsing XML: prefix must not be bound to one of the reserved namespace names
- 关于设置登录过滤权限后 css和js无法加载问题
- CentOS 6.6搭建LNMP环境
- [疯狂Java]JDBC:连接池
- android studio 使用gradle 导出jar包,并打包assets目录
- 如何优雅地进行页面间的跳转(iOS)
- riverbed mib
- mac下cordova的ios-deploy安装问题
- 【consola字体下载】
- click多次注册事件会导致一个事件被触发多次的解决方法
- Snackbar使用及其注意事项(转)
- iOS 中如何实现 App 主题切换
- EL表达式函数
- C++指针详解
- sed命令详解
- 《疯狂Java讲义(第3版)》.(李刚)——面向对象及UML