其他分享
首页 > 其他分享> > Makefile 工程管理

Makefile 工程管理

作者:互联网

文章目录

本篇全面深入的讲解 make 项目管理工具,为后续阅读 U-Boot、内核等复杂源码及项目开发打下基础

Make 的原理及 Makefile 的基础知识

Make 简介

工程管理器,顾名思义,是指管理较多的文件

Make 工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入 Makefile 文件的内容来执行大量的编译工作

Make 将只编译改动的代码文件,而不用完全编译。

Makefile 基本结构

Makefile 是 Make 读入的唯一配置文件

Makefile 格式

target: dependency_files
<TAB>  command

例子

hello.o: hello.c hello.h
gcc –c hello.c –o hello.o

Makefile 变量

一个复杂一些的例子:

创建和使用变量

创建变量的目的:用来代替一个文本字符串:

变量定义的两种方式

刚才的例子

OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
	$(CC) $(OBJS) -o sunq
kang.o : kang.c kang.h
	$(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
	$(CC) $(CFLAGS) -c yul.c -o yul.o

递归展开方式 VAR=var;例子:

foo = $(bar) 
bar = $(ugh) 
ugh = Huh? 

$(foo) 的值为?

echo $(foo) 来进行查看

简单方式 VAR:=var

m := mm 
x := $(m) 
y := $(x) bar 
x := later 
echo $(x) $(y) # 看看打印什么信息?

?= 定义变量

dir := /foo/bar
FOO ?= bar # FOO是?

为变量添加值;你可以通过 += 为已定义的变量添加新的值

Main=hello.o hello-1.o
Main+=hello-2.o

预定义变量

例子:

Hello: main.c main.h 
<tab> $(CC) –o hello main.c
clean:
<tab> $(RM) hello

预定义变量

刚才的例子

自动变量

刚才的例子:

OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
	$(CC) $^ -o $@
kang.o : kang.c kang.h 
	$(CC) $(CFLAGS) -c $< -o $@
yul.o : yul.c yul.h
	$(CC) $(CFLAGS) -c $< -o $@

环境变量

Make 命令的选项及 Makefile 中的隐含规则

Make 使用

直接运行 make

选项

Makefile 的隐含规则

隐含规则 1:编译 C 程序的隐含规则

隐含规则 2:链接 Object 文件的隐含规则

实例 1:

实例 2:

VPATH 及嵌套的 Makefile

VPATH 的用法

VPATH:虚路径

实例 3:

嵌套的 Makefile

案例:

ls -R
Makefile	f2		main
f1		include		obj

./f1:
Makefile	f1.c

./f2:
Makefile	f2.c

./include:
myinclude.h

./main:
Makefile	main.c

./obj:
Makefile
CC=gcc
SUBDIRS=f1 \
		f2 \
		main \
		obj
OBJS=f1.o f2.o main.o
BIN=myapp
OBJS_DIR=obj
BIN_DIR=bin
export CC OBJS BIN OBJS_DIR BIN_DIR

all:CHECK_DIR $(SUBDIRS)
CHECK_DIR:
	mkdir -p $(BIN_DIR)
$(SUBDIRS):ECHO
	make -C $@
ECHO:
	@echo $(SUBDIRS)
	@echo begin compile
CLEAN:
	@$(RM) $(OBJS_DIR)/*.o
	@rm -rf $(BIN_DIR)

标签:OBJS,工程,管理,CC,kang,Makefile,yul,main
来源: https://blog.csdn.net/u010518627/article/details/115861670