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 #生成动态库文件
--------------------------------------------------------
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 #生成动态库文件
--------------------------------------------------------
相关文章推荐
- 【Symbian基础知识整理】_Symbian的目录结构和程序编译链接的简单过程
- 嵌入式Linux完全开发手册-------------基础知识(交叉编译工具、Makefile、常用汇编指令)
- Linux从用户层到内核层系列 - TCP/IP协议栈部分系列7: 基础知识之 - Linux内核源码目录与内核编译选项
- 向架构师进军--->系统架构设计基础知识
- Make编译学习笔记(一)Makefile基础
- 【c基础知识】#ifdef 条件编译的巧妙用法
- iOS SDK基础知识:UITextView & UITextViewDelegate
- Java基础知识<1>
- WinCE基础知识(二):WinCE 5.0 的目录结构
- Linux 基础知识:目录结构
- #基础知识# - URL&XHtml
- 基础知识:Q&A
- mysql基础&重点知识总结及在python中的应用(2)
- linux 目录结构+常用命令+压缩命令+vim使用+及一些基础知识(非常好)
- 四轴飞行diy全套入门教程(从最基础的开始) & 导线的知识入门(细节决定内涵)
- makefile编写---单个子目录编译自动变量模板ok
- android开发学习---linux下开发环境的搭建&& android基础知识介绍
- Linux内核模块的编译基础知识
- Linux基础知识之Linux系统各个目录的作用
- makefile多级目录编译