Linux系统-Makefile规则介绍、基本使用

简介: Makefile在Linux下使用非常常见,这篇就介绍Linux下Makefile基本使用。命令行的make命令支持解析makefile和Makefile文件。如果我们编写的规则文件不是makefile或者Makefile文件,那么需要使用-f选项指定。

1. Makefile基本使用

命令行的make命令支持解析makefile和Makefile文件。
如果我们编写的规则文件不是makefile或者Makefile文件,那么需要使用-f选项指定。

[wbyq@wbyq linux_c]$ make -f  <规则文件>

Makefile文件内部是以目标作为单位执行规则顺序的。

image-20211208085444547

在Makefile文件里使用shell命令行的命令时,需要使用TAB键开头。

 app:app.c
     gcc app.c -o app

<目标文件名称>:<依赖文件>

    gcc  app.c -o app               

什么是依赖文件?
就是在生成这个目标之前,需要得到的文件。

2. make指定目标执行

Makefile文件里可以有多个目标文件,我们在命令行执行make命令默认执行Makefile文件里的第一个目标。如果需要执行指定的目标,需要在make命令后面加上执行的目标名称即可。

image-20211208085557380

[wbyq@wbyq linux_c]$ make
pwd
/mnt/hgfs/linux-share-dir/linux_c
[wbyq@wbyq linux_c]$ make app2
ls
a.out  app.c  Makefile  makefile_1234567  sum
[wbyq@wbyq linux_c]$ make app3
touch 123.c
touch 456.c
[wbyq@wbyq linux_c]$ make app4
rm 123.c
rm 456.c
[wbyq@wbyq linux_c]$ make app1 app2 app3 app4
pwd
/mnt/hgfs/linux-share-dir/linux_c
ls
a.out  app.c  Makefile  makefile_1234567  sum
touch 123.c
touch 456.c
rm 123.c
rm 456.c
[wbyq@wbyq linux_c]$

3. 隐藏makefile文件执行命令

方法1: make -s
方法2: 在执行的命令前面加上@符号

image-20211208085643457

4. 示例1: 编译一个简单的工程

使用显式规则编写Makefile文件,编译一个工程。

image-20211208085718496

[wbyq@wbyq linux_c]$ ls
app.c  Makefile  sum.c  sum.h
[wbyq@wbyq linux_c]$ make -n
gcc sum.c -c
gcc app.c -c    
gcc sum.o app.o -o app
[wbyq@wbyq linux_c]$ make
gcc sum.c -c
gcc app.c -c    
gcc sum.o app.o -o app
[wbyq@wbyq linux_c]$ ./app
sum_val=300
[wbyq@wbyq linux_c]$ 

5. 示例2: 编译一个简单的工程

使用自动化编译符号优化Makefile文件,编译一个工程。

image-20211208085806070

6. 示例3: 编译一个简单的工程

使用隐式规则编写Makefile文件,编译一个工程。

image-20211208085837917

[wbyq@wbyq linux_c]$ ls
app.c  Makefile  sum.c  sum.h
[wbyq@wbyq linux_c]$ make -n
cc    -c -o app.o app.c
cc    -c -o sum.o sum.c
gcc app.o sum.o -o app
[wbyq@wbyq linux_c]$ make
cc    -c -o app.o app.c
cc    -c -o sum.o sum.c
gcc app.o sum.o -o app
[wbyq@wbyq linux_c]$ make
make: “app”是最新的。
[wbyq@wbyq linux_c]$ make
cc    -c -o app.o app.c
cc    -c -o sum.o sum.c
gcc app.o sum.o -o app

7. 特殊变量的使用

image-20211208085915028

编写的Makefile文件:
CC=gcc   #指定编译器
VPATH=./main:./sum  #指定隐式推导时搜索的路径
CFLAGS=-I ./sum  #指定编译器编译是自动增加的选项参数
OBJ=app.o sum.o  #依赖文件
app:$(OBJ)
    $(CC) $^ -o $@
.PHONY:clear #声明伪目标
clear:
    rm *.o app
目录
相关文章
|
2月前
|
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挂载选项更通用,兼容所有系统。
221 3
Linux系统禁用swap
|
2月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
329 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
293 0
Linux系统初始化脚本
|
3月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
234 18
|
2月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
283 1
|
2月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1005 1
|
3月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1569 10
|
缓存 Linux 测试技术
安装【银河麒麟V10】linux系统--并挂载镜像
安装【银河麒麟V10】linux系统--并挂载镜像
5941 0
|
关系型数据库 MySQL Linux
卸载、下载、安装mysql(Linux系统centos7)
卸载、下载、安装mysql(Linux系统centos7)
449 0
|
Linux
手把手教会你安装Linux系统
手把手教会你安装Linux系统
237 0