Make编译
1. make
工作原理
make
的工作方式基于文件的 依赖关系 和 时间戳,它通过以下步骤来管理构建过程:
- 读取
Makefile
:make
通过读取Makefile
文件来获取构建规则。 - 检查目标文件的修改时间:
make
会根据文件的修改时间来判断是否需要重新编译。例如,如果源文件source.c
的修改时间晚于目标文件source.o
,make
会认为目标文件过时,重新执行相关的编译命令。 - 执行构建规则:如果目标文件需要重新构建,
make
会根据依赖关系和规则执行编译、链接等操作,直到最终目标文件(如可执行文件或库文件)完成。
2. Makefile
的基本结构
Makefile
是 make
使用的配置文件,定义了构建规则、目标文件、依赖关系和命令。一个基本的 Makefile
通常包含以下几个部分:
基本语法
- 目标(Target):要构建的文件(通常是目标文件或最终可执行文件)。
- 依赖(Dependency):目标文件所依赖的文件。如果依赖文件有更新,目标文件就需要重新构建。
- 命令(Command):用于生成目标的具体命令(如编译命令)。命令必须以
TAB
缩进。
target: dependencies
command
3. Makefile
示例
假设我们有一个简单的 C++ 项目,包含两个源文件 main.cpp
和 utils.cpp
,它们生成目标文件 main.o
和 utils.o
,并最终生成可执行文件 myapp
。
CC = g++ # 编译器设置为 g++
CFLAGS = -Wall -g # 编译选项,-Wall 启用所有警告,-g 用于调试
# 目标文件
OBJS = main.o utils.o # 目标文件
# 可执行文件
TARGET = myapp
# 默认目标
all: $(TARGET)
$(TARGET): $(OBJS) # 目标文件依赖关系
$(CC) $(OBJS) -o $(TARGET) # 链接命令,生成可执行文件
main.o: main.cpp utils.h
$(CC) $(CFLAGS) -c main.cpp # 编译命令,生成 main.o
utils.o: utils.cpp utils.h
$(CC) $(CFLAGS) -c utils.cpp # 编译命令,生成 utils.o
clean:
rm -f $(OBJS) $(TARGET) # 清理中间文件和目标文件
目标作为执行的