Makefile介绍

Makefile 介绍

Makefile 是一个用于控制编译过程的文件,最常用于编译 C 和 C++ 程序。Makefile 包含了一系列的规则,每个规则定义了如何生成一个目标文件(通常是可执行文件或对象文件)。Make 工具会读取 Makefile 并根据规则自动执行相应的命令,从而简化和自动化编译过程。

基本结构

一个简单的 Makefile 通常包含以下几个部分:

  1. 变量定义:用于定义一些常用的路径或参数。

  2. 目标规则:定义如何生成目标文件。

  3. 隐含规则:Make 自带的一些通用规则,可以简化 Makefile 的编写。

  4. 特殊目标:用于控制 Make 的行为。

基本语法
  1. 变量定义

    cpp 复制代码
    CC = gcc
    CFLAGS = -Wall -O2
    OBJ = main.o utils.o
  2. 目标规则

    cpp 复制代码
    target: dependencies
            commands
    • target:目标文件,可以是可执行文件、对象文件等。

    • dependencies:目标文件的依赖文件。

    • commands:生成目标文件所需的命令。

  3. 隐含规则

    Make 有一些预定义的规则,例如:

    复制代码
    %.o: %.c
            $(CC) $(CFLAGS) -c $< -o $@
  4. 特殊目标

    • .PHONY:定义一些虚拟目标,这些目标不是文件。

      复制代码
      .PHONY: clean
      clean:
              rm -f $(OBJ) main

使用说明

1. 创建一个简单的 Makefile

假设有一个简单的 C 项目,包含两个文件:main.cutils.c

cpp 复制代码
# 定义变量
CC = gcc
CFLAGS = -Wall -O2
OBJ = main.o utils.o
TARGET = main

# 默认目标
all: $(TARGET)

# 生成可执行文件
$(TARGET): $(OBJ)
	$(CC) $(CFLAGS) -o $@ $^

# 生成对象文件
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

# 清理生成的文件
.PHONY: clean
clean:
	rm -f $(OBJ) $(TARGET)
2. 使用 Make 工具
  1. 编译项目

    复制代码
    make

    这将自动执行 all 目标,生成可执行文件 main

  2. 清理生成的文件

    复制代码
    make clean

    这会删除所有生成的文件(包括对象文件和可执行文件)。

  3. 重新编译

    如果源文件有修改,只需运行 make,Make 工具会自动检测依赖关系并重新编译需要更新的文件。

3. 高级用法
  1. 条件语句

    复制代码
    ifeq ($(DEBUG), 1)
    CFLAGS += -g
    endif
  2. 函数

    复制代码
    OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
  3. 递归 Make

    复制代码
    SUBDIRS = subdir1 subdir2
    .PHONY: $(SUBDIRS)
    
    all: $(SUBDIRS)
    
    $(SUBDIRS):
        $(MAKE) -C $@

总结

Makefile 是一个强大的工具,可以显著简化和自动化编译过程。通过合理定义变量、目标规则和特殊目标,可以轻松管理复杂的多文件项目系统。

相关推荐
Johny_Zhao7 分钟前
Centos8搭建hadoop高可用集群
linux·hadoop·python·网络安全·信息安全·云计算·shell·yum源·系统运维·itsm
longxibo8 分钟前
飞牛系统安装DataEase自定义Docker包
运维·docker·容器
ん贤19 分钟前
GMP模型
运维·服务器·后端·golang
abbgogo21 分钟前
子域名收集和c段查询
运维·服务器·信息收集
NicolasCage21 分钟前
java 项目服务器部署
运维·自动化运维
杜子不疼.26 分钟前
Linux的生态与软件安装
linux·运维·服务器
哈基咩43 分钟前
Go语言unsafe包深度解析
服务器·开发语言·后端·golang
wanhengidc1 小时前
服务器被网络攻击后该如何进行处理?
运维·服务器·网络
MickeyCV1 小时前
MySQL数据库本地迁移到云端完整教程
服务器·数据库·mysql·oracle
Tipriest_2 小时前
离线进行apt安装的过程(在只能本地传输的ubuntu主机上使用apt安装)
linux·运维·ubuntu·apt·install·deb