掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

Linux中Makefile文件如何编写 Makefile规则详细说明

在Linux的世界里,Makefile文件就像是一把神奇的钥匙,它能够自动编译和链接程序。但编写Makefile文件,却常常让初学者感到困惑。今天,就让我们一起揭开Makefile的神秘面纱,看看如何编写一个Makefile规则。

一、什么是Makefile?

Makefile是一个描述程序之间依赖关系的文本文件,用于自动化编译和链接程序。它包含了一系列的规则,每个规则都由目标、依赖和命令三部分组成。目标是要生成的文件,依赖是生成目标所需要的文件,而命令则是生成目标的具体操作。

二、如何编写Makefile规则?

1)Makefile规则的三个组成部分

编写Makefile规则,首先要明确目标、依赖和命令。

  1. 目标(target)

目标是我们需要生成的文件,可以是可执行程序、库文件或其他任何类型的文件。在Makefile文件中,目标通常放在规则的第一行,以冒号(:)结尾。例如:

target: prerequisites
    # command
  1. 依赖(prerequisites)

依赖是生成目标所需的源文件或其他目标。在Makefile文件中,依赖通常放在目标后面,用空格分隔。依赖可以是单个文件,也可以是由多个文件组成的列表。例如:

target: prerequisites1 prerequisites2
    # command

当依赖发生变化时,目标需要重新生成。

  1. 命令(command)

命令是用来实现从依赖到目标的转换过程。在Makefile文件中,命令通常放在依赖下面的缩进区域。命令可以是单个命令,也可以是由多个命令组成的列表。命令之间用分号(;)或换行符分隔。例如:

target: prerequisites
    command1; command2

需要注意的是,命令前面必须有一个制表符(Tab),而不是空格。

2)编写Makefile规则

例如,我们有一个名为"program"的程序,它依赖于"main.o"和"module.o"两个源文件,那么我们可以这样写:

program: main.o module.o
    gcc -o program main.o module.o

在这里,"program"是目标,"main.o"和"module.o"是依赖,"gcc -o program main.o module.o"是命令。当"main.o"或"module.o"有任何改变时,"program"就会被重新构建。

三、Makefile的规则示例详解

以下是一个简单的 Makefile 示例,用于编译一个 C 程序:

# 变量定义CC = gcc
CFLAGS = -Wall -g
TARGET = myprogram
SOURCES = main.c utils.c
OBJECTS = $(SOURCES:.c=.o)# 默认规则all: $(TARGET)# 生成目标$(TARGET): $(OBJECTS)
   $(CC) $(CFLAGS) -o $@ $^# 生成对象文件%.o: %.c
   $(CC) $(CFLAGS) -c $< -o $@# 清理生成的文件clean:
   rm -f $(TARGET) $(OBJECTS)

CC:编译器。

CFLAGS:编译选项。

TARGET:最终生成的可执行文件名。

SOURCES:源文件列表。

OBJECTS:从源文件生成的对象文件列表。

all: $(TARGET):默认目标,当运行 make 时将生成 myprogram。

$(TARGET): $(OBJECTS):当对象文件更新时,重新生成可执行文件。

%.o: %.c:规则表示,任何 .o 文件都可以由其对应的 .c 文件生成。

clean:自定义目标,用于清理生成的文件。

  1. 变量

Makefile 允许定义变量来简化管理。例如,可以将编译器和编译选项定义为变量,这样在整个 Makefile 中可以复用。

  1. 隐式规则

Makefile 有一些内置的隐式规则。例如,make 会自动识别 .c 文件需要生成 .o 文件,使用 cc -c file.c 的命令。

  1. 特殊目标

.PHONY:用于声明不生成文件的目标,如 clean。

.PHONY: cleanclean:
   rm -f $(TARGET) $(OBJECTS)

通过以上例子,我们可以看到Makefile规则的强大功能和灵活性。在实际开发过程中,我们可以根据项目的需求来编写合适的Makefile文件,从而提高代码的可维护性和可移植性。

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 购物小票识别

    支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景

    支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景

  • 涉农贷款地址识别

    涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。

    涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。

  • 人脸四要素

    根据给定的手机号、姓名、身份证、人像图片核验是否一致

    根据给定的手机号、姓名、身份证、人像图片核验是否一致

  • 个人/企业涉诉查询

    通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

    通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

  • IP反查域名

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

0512-88869195
数 据 驱 动 未 来
Data Drives The Future