多层次makefile编写例程
一、前言
Makefile是一个常用的构建工具,可以自动化编译、链接和打包等操作。在大型项目中,Makefile的编写尤为重要,因为它能够帮助我们管理复杂的文件依赖关系和构建过程。
本文将介绍如何编写多层次的Makefile,以适应不同规模和复杂度的项目。
二、基本概念
1. 目标(Target)
在Makefile中,目标指的是需要生成的文件或者执行的命令。每个目标都有一个或多个依赖项(Dependency),表示该目标需要哪些文件或命令才能被生成或执行。
2. 依赖项(Dependency)
依赖项指的是目标所需要的文件或者命令。如果某个目标的依赖项没有被更新,则该目标不会被重新生成。
3. 规则(Rule)
规则由目标、依赖项和命令组成。它告诉Make如何生成一个目标文件。
4. 变量(Variable)
变量用来定义一些常量或者参数,并可以在整个Makefile中使用。变量名必须以$开头,并用()括起来。
5. 函数(Function)
函数用来处理变量或者字符串,并返回结果。函数名必须以$开头,并用{}括起来。
三、多层次Makefile编写例程
1. 简单的Makefile
下面是一个简单的Makefile,用来编译一个hello.c文件:
```
CC = gcc
CFLAGS = -Wall -g
hello: hello.o
    $(CC) $(CFLAGS) -o $@ $<
hello.o: hello.c
    $(CC) $(CFLAGS) -c $<
```
这个Makefile定义了两个目标:hello和hello.o。其中,hello依赖于hello.o,表示需要将hello.o编译链接成可执行文件。而hello.o则依赖于hello.c,表示需要将源代码编译成目标文件。
2. 多目录结构的Makefile
在实际项目中,通常会存在多级目录结构。为了管理这些目录和文件依赖关系,可以使用VPATH变量和vpath命令。
下面是一个示例:
```
VPATH = src include
CC = gcc
CFLAGS = -Wall -g
INCLUDES = -I include
TARGET = bin/hello
OBJS = obj/hello.o obj/util.o
$(TARGET): $(OBJS)
    $(CC) $(CFLAGS) $(INCLUDES) -o $@ $^
obj/%.o: %.c
    @mkdir -p obj bin
    $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
.PHONY: clean
clean:
    rm -rf bin obj
```
这个Makefile定义了两个变量:VPATH和INCLUDES。其中,VPATH指定了源代码和头文件所在的路径;INCLUDES指定了头文件所在的路径。
同时,这个Makefile定义了两个目标:$(TARGET)和obj/%.o。其中,$(TARGET)表示需要
生成可执行文件bin/hello;obj/%.o表示需要将源代码编译成目标文件。
3. 带有动态库的Makefile
在实际项目中,通常会使用动态库来管理依赖关系。为了使用动态库,需要使用-L和-l选项来指定库文件的路径和名称。
下面是一个示例:
```
CC = gcc
CFLAGS = -Wall -g
INCLUDES = -I include
LIBS = -L lib -lfoo
TARGET = bin/hello
OBJS = obj/hello.o obj/util.o
$(TARGET): $(OBJS)
    $(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LIBS)
obj/%.o: %.c
    @mkdir -p obj binmakefile phony
    $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。