MakeFile基础知识&多目录编译

Makefile的基础知识
http://blog.csdn.net/runninglion/article/details/28111859

======================================================================================================
多目录工程的 makefile 范例
http://blog.sina.com.cn/s/blog_449fafb90100y37u.html


假设要编译的工程是一个主目录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




第一种做法是在每一个子目录中都添加一个makefile文件, 当然主目录proj中的makefile必不可少,同时还在主目录中
创建一个env.mk文件,其作用就是包含了其他makefile都用到的模式规则
--------------------- env.mk----------------------------
CC := gcc


LIB_DIR = $(MAKEROOT)/libs
APP_DIR = $(MAKEROOT)/src
TARGET_DIR = $(MAKEROOT)/target
BUILD_DIR = $(MAKEROOT)/build


TARGET_PROG = $(TARGET_DIR)/just_cti_server


#头文件目录
INCLUDE_DIR := \  
-I$(MAKEROOT)/ui \
-I$(MAKEROOT)/main \
-I$(MAKEROOT)/math




CFLAGS = \
  -fPIC \
-O3 \
$(DEBUG) \
-Wall  \
$(INCLUDES)


LDFLAGS = \
-lpthread \
-L/usr/lib64/mysql \
-lmysqlclient \


#对所有的.o文件以.c文件创建它
%.o : %.c
${CC} ${CFLAGS} -c $< -o $(TARGET_DIR)/$@
--------------------------------------------------------


-------------------proj/makefile -----------------------
export MAKEROOT := $(shell pwd)
include ./env.mk


SUBS := $(shell find . -name "Makefile")
SUBDIRS := $(dir $(filter-out ./Makefile, $(shell find . -name "Makefile")))
include $(MAKEROOT)/evn.mk


define build_sub_obj
        for dir in $(SUBDIRS); do \
                make -C $$dir; \
        done
endef




all :
@$(call build_obj) #调用过程
$(CC) $(TARGET_DIR)/*.o $(LDFLAGS) -o $(TARGET_PROG)  #生成最终目标
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 -----------------------
include $(MAKEROOT)/env.mk #包括头文件,执行模式规则
.PHONY : all
all :
gcc -shared -o $(LIB_DIR)/libmath.so math.c math.h #生成动态库文件
--------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值