【makefile基本语法】

本文介绍了Makefile的基础语法,包括赋值操作如`:=`, `=`, `?=`和`+=`,以及如何利用自动化变量如`$@`, `$<`和`$^`简化依赖和目标的表示。通过示例展示了如何处理多个源文件的编译,使得在增加依赖文件时能更加便捷。" 122900603,9561060,"HTML5+CSS表单元素详解:input, textarea, select

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新建makefile

touch makefile

赋值

:=

立刻赋值

makefile
makefile中应使用“#”作为注释,但不知为何此处可以用”//"

在这里插入图片描述

=

延迟赋值,其值为makefile中最后被指定的值

在这里插入图片描述
在这里插入图片描述

?=

若变量未被赋值,为其赋值,若已赋值,使用原值

//已经给var1赋值的情况
在这里插入图片描述
在这里插入图片描述
//未给var1赋值的情况
在这里插入图片描述
在这里插入图片描述

+=

追加赋值,在已经定义的字符串里添加新的字符串,不过中间会补空格
在这里插入图片描述
在这里插入图片描述

换行符 \

若赋值很长,也可使用换行符“\”, 如下图
在这里插入图片描述
在这里插入图片描述

自动化变量

$@: 表示所有目标
$<:表示
$:表示所有依赖

例:将helloworld.c分成三个程序

1、main.c

#include<stdio.h>
#include "hello.h"
 
int main(void){
    hello();
    return 0;
}

可使用“cat"查看文件中代码
在这里插入图片描述

在这里插入图片描述

2、hello.c
注意这里是hello函数

#include<stdio.h>
#include "hello.h"

void hello(void){
	printf("Hello World\n");
}

3、hello.h

#ifndef _HELLO_
#define _HELLO_

void hello(void);

#endif

普通makefile

此时makefile如下

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

clean:
    rm -rf *.o hello

编译结果:
在这里插入图片描述
使用此makefile虽然也可成功编译,但编译文件很多时,会非常复杂,可以使用自动化变量解决此问题

用变量表示依赖文件

后续增加依赖文件时,可直接在变量var后增加

使用通配符%和自动化变量$@ $<替代依赖和目标

在这里插入图片描述

var:=hello.o main.o

hello:$(var)
    gcc $(var) -o hello
%.o:%.c
    gcc -c $< -o $@
main.o:main.c
    gcc -c main.c -o main.o

clean:
    rm -rf *.o hello

%会自动匹配hello.o hello.c
$<依赖
$@目标
编译结果:
在这里插入图片描述

使用自动化变量$^ 表示所有依赖

在这里插入图片描述

var:=hello.o main.o

hello:$(var)
    gcc $^ -o hello
    echo $^
%.o:%.c
    gcc -c $< -o $@
main.o:main.c
    gcc -c main.c -o main.o

clean:
    rm -rf *.o hello

编译结果:
在这里插入图片描述
是不是一下就简略很多呢
//春草已经破土,等繁花开满校园,可我仍不能去见那劳动湖上的黑嘴鸥,龙沙公园的松鼠,夜市的烤苕皮、梅菜扣肉、烤猪蹄…喜家德虾仁水饺,各家的烤肉火锅阿巴阿巴

Make命令   在make命令后不仅可以出现宏定义,还可以跟其他命令行参数,这些参数指定了需要编译的目标文件。其标准形式为:   target1 [target2 …]:[:][dependent1 …][;commands][#…]   [(tab) commands][#…]   方括号中间的部分表示可选项。Targets和dependents当中可以包含字符、数字、句点和"/"符号。除了引用,commands中不能含有"#",也不允许换行。   在通常的情况下命令行参数中只含有一个冒号":",此时command序列通常和makefile文件中某些定义文件间依赖关系的描述行有关。如果与目标相关连的那些描述行指定了相关的command序列,那么就执行这些相关的command命令,即使在分号和(tab)后面的aommand字段甚至有可能是NULL。如果那些与目标相关连的行没有指定command,那么将调用系统默认的目标文件生成规则。   如果命令行参数中含有两个冒号"::",则此时的command序列也许会和makefile中所有描述文件依赖关系的行有关。此时将执行那些与目标相关连的描述行所指向的相关命令。同时还将执行build-in规则。   如果在执行command命令时返回了一个非"0"的出错信号,例如makefile文件中出现了错误的目标文件名或者出现了以连字符打头的命令字符串,make操作一般会就此终止,但如果make后带有"-i"参数,则make将忽略此类出错信号。   Make命本身可带有四种参数:标志、宏定义、描述文件名和目标文件名。其标准形式为:   Make [flags] [macro definitions] [targets]   Unix系统下标志位flags选项及其含义为:   -f file  指定file文件为描述文件,如果file参数为"-"符,那么描述文件指向标准输入。如果没有"-f"参数,则系统将默认当前目录下名为makefile或者名为Makefile的文件为描述文件。在linux中, GNU make 工具在当前工作目录中按照GNUmakefilemakefileMakefile的顺序搜索 makefile文件。   -i   忽略命令执行返回的出错信息。   -s   沉默模式,在执行之前不输出相应的命令行信息。   -r   禁止使用build-in规则。   -n   非执行模式,输出所有执行命令,但并不执行。   -t   更新目标文件。   -q   make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息。   -p   输出所有宏定义和目标文件描述。   -d   Debug模式,输出有关文件和检测时间的详细信息。   linux下make标志位的常用选项与Unix系统中稍有不同,下面我们只列出了不同部分:   -c dir   在读取 makefile 之前改变到指定的目录dir。   -I dir   当包含其他 makefile文件时,利用该选项指定搜索目录。   -h   help文挡,显示所有的make选项。   -w   在处理 makefile 之前和之后,都显示工作目录。   通过命令行参数中的target ,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值