您的位置:首页 > 编程语言 > C语言/C++

MakeFile基础知识&多目录编译

2017-12-01 19:03 281 查看
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 #生成动态库文件

--------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 makefile