Involution Hell
Computer ScienceCpp_backendEasy_compile

Make编译

Make编译

1. make 工作原理

make 的工作方式基于文件的 依赖关系时间戳,它通过以下步骤来管理构建过程:

  1. 读取 Makefilemake 通过读取 Makefile 文件来获取构建规则。
  2. 检查目标文件的修改时间make 会根据文件的修改时间来判断是否需要重新编译。例如,如果源文件 source.c 的修改时间晚于目标文件 source.omake 会认为目标文件过时,重新执行相关的编译命令。
  3. 执行构建规则:如果目标文件需要重新构建,make 会根据依赖关系和规则执行编译、链接等操作,直到最终目标文件(如可执行文件或库文件)完成。

2. Makefile 的基本结构

Makefilemake 使用的配置文件,定义了构建规则、目标文件、依赖关系和命令。一个基本的 Makefile 通常包含以下几个部分:

基本语法

  • 目标(Target):要构建的文件(通常是目标文件或最终可执行文件)。
  • 依赖(Dependency):目标文件所依赖的文件。如果依赖文件有更新,目标文件就需要重新构建。
  • 命令(Command):用于生成目标的具体命令(如编译命令)。命令必须以 TAB 缩进。
target: dependencies
    command

3. Makefile 示例

假设我们有一个简单的 C++ 项目,包含两个源文件 main.cpputils.cpp,它们生成目标文件 main.outils.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)       # 清理中间文件和目标文件

目标作为执行的


贡献者