linux系统中Makefile的基本使用方法

简介: linux系统中Makefile的基本使用方法

Makefile是一种编译控制文件,广泛用于项目的自动化构建。它定义了一系列的规则来指导构建的过程。通过Makefile,开发者可以轻松管理大型项目的编译链接、清理等任务。本文将从Makefile的基础用法讲起,逐步深入到更高级的应用,为你呈现一个全面而详细的Makefile使用手册。

Makefile的基本结构

一个最简单的Makefile包含规则,规则由目标(target)、依赖(dependencies)和命令(commands)三部分组成:

target: dependencies
    commands

命令前的Tab键是必须的。下面是一个简单的示例:

hello: hello.c
    gcc -o hello hello.c

变量的使用

在Makefile中声明变量可以使得我们的代码更加简洁。

CC=gcc
CFLAGS=-std=c99
LDFLAGS=
OBJ=main.o utils.o
app: $(OBJ)
    $(CC) -o app $(OBJ) $(LDFLAGS)
main.o: main.c
    $(CC) $(CFLAGS) -c main.c
utils.o: utils.c utils.h
    $(CC) $(CFLAGS) -c utils.c

通用规则和模式匹配

模式规则可以减少我们重复相同命令的工作量。

%.o: %.c
    $(CC) $(CFLAGS) -c $<

$< 是自动变量之一,代表依赖列表中的第一项。

自动化变量

Makefile提供了一系列自动化变量,它们在规则的命令中非常有用:

  • $@ 表示规则中的目标文件名;
  • $^ 表示所有的依赖文件列表;
  • $< 表示第一个依赖文件;
  • $? 表示所有比目标新的依赖文件列表。

函数的使用

Makefile中内置了许多函数,用以执行字符串操作、文件操作等。

例如,获取源文件列表:

SRC=$(wildcard *.c)
OBJ=$(patsubst %.c,%.o,$(SRC))

控制Make的行为

  • make -B 强制重新编译所有目标;
  • make -n 显示将要执行的命令而不实际执行;
  • make -f <file> 指定使用其他名称的Makefile文件;
  • make -j 允许并行执行(多核编译)。

高级用法 - 条件判断

Makefile也支持条件判断,这在不同环境需要执行不同命令时非常有用。

ifeq ($(OS),Windows_NT)
    RM=del /Q
else
    RM=rm -f
endif
clean:
    $(RM) *.o

使用变量和文件包含来组织Makefile

对于大型项目,组织多个Makefile是一种好方法。

# 在子Makefile中
include config.mk

自定义函数

通过定义可以重用的函数,你可以使你的Makefile变得更加强大和灵活。

define run-cc
$(CC) $(CFLAGS) -o $@ $^
endef
app: $(OBJ)
    $(call run-cc)

处理多目标

定义一个规则来批量处理多个文件。

FILES := file1 file2 file3
all: $(FILES)
$(FILES):
    touch $@

伪目标的使用

伪目标不代表实际的文件,它只是一个动作的名称。

.PHONY: clean
clean:
    rm -f *.o app

调试Makefile

你可以使用make --debug或添加注释来帮助调试Makefile。

app: main.o utils.o
    # 这是一个链接的命令
    $(CC) -o app main.o utils.o

结语

Makefile是构建自动化的强大工具,既可以简化小型项目的构建流程,也能够灵活管理大型应用程序的复杂构建系统。通过本文的详细论述和丰富示例,您应该能够基本掌握Makefile的各项技能,并在实际项目中加以应用。

希望以上内容对你深入理解和使用Makefile有所帮助。记住,“实践出真知”——编写你自己的Makefile并尝试使用这些特性是最好的学习方式。

目录
相关文章
|
3月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
255 3
Linux系统禁用swap
|
3月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
372 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
340 0
Linux系统初始化脚本
|
3月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
319 1
|
3月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1034 1
|
Linux 开发工具 C语言
韦东山Linux教学视频中的makefile文件详细介绍
韦东山Linux教学视频中的makefile文件详细介绍
412 0
|
Linux Windows 程序员
|
3月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
二、Linux文本处理与文件操作核心命令