您的位置:首页 > 其它

多目录工程的 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—————————-

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啦!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: