Makefile用法及变量

Makefile是一个用于自动化编译的工具,能大大提高软件开发效率,尤其在处理多文件工程时。其基本语法包括目标、依赖和命令,通过定义变量和利用自动变量,可以实现灵活的编译规则。此外,Makefile还包含隐含变量,如CC和CFLAGS,用于设置编译器和编译选项。

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

Makefile的重要性:会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力

一、Makefile概述

        make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

        “自动化编译”:一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率

        提升编译效率:再次编译,只编译修改的文件

二、Makefile基本语法

                target... : prerequisites ...

                       command

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令,需要用Tab键空一格。(任意的Shell命令)

三、Makefile的变量

1.Makefile创建变量的目的

        用来代替一个文本字符串:

                1)系列文件的名字 

                2)传递给编译器的参数

                3)需要运行的程序

                4)需要查找源代码的目录

                5)你需要输出信息的目录 

                6)你想做的其它事情。

#目标:依赖
#  命令

#一步编译.c->exe
#test:add.c sub.c test.c
#	gcc add.c sub.c test.c -o test

#两步编译.c->.o->exe
test:add.o sub.o test.o
	echo $(LDFLAGS)
	gcc add.o sub.o test.o -o test
add.o:add.c
	gcc -c add.c -o add.o
sub.o:sub.c
	gcc -c sub.c -o sub.o
test.o:test.c
	gcc -c test.c -o test.o

#伪目标
.PHONY:clean
clean:
	rm *.o

2.自定义变量

        x = a               变量在声明时需要给予初值

        $(x)或${x}       取值

        如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。

3.Makefile变量的赋值

符号作用
=

是最基本的赋值方式,与在文中位置无关,系统自动推导将最终的赋值作为该变量的值。

?=

作用是当某变量前面已经定义赋值过,则不执行本次定义赋值,否则执行本次赋值

:=

是覆盖式赋值,假如某变量在前面已经定义赋值过,则将本次赋值作为最新的变量值

+=追加赋值,旧值保持不变,将新值黏贴到旧值后面
#变量的定义和赋值
#SRC = add.o sub.o test.o
SRC = add.o
SRC += sub.o
SRC += test.o

#两步编译.c->.o->exe
test:$(SRC)
	gcc ${SRC} -o test
add.o:add.c
	gcc -c add.c -o add.o
sub.o:sub.c
	gcc -c sub.c -o sub.o
test.o:test.c
	gcc -c test.c -o test.o

#伪目标
.PHONY:clean
clean:
	rm *.o

4.自动变量

$*    不包含扩展名的目标文件名称

$+    所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件

$<     第一个依赖文件的名称

$?     所有时间戳比目标文件晚的的依赖文件,并以空格分开

$@       目标文件的完整名称

$^     所有不重复的目标依赖文件,以空格分开

$%       如果目标是归档成员,则该变量表示目标的归档成员名称

#自动变量
#SRC = add.o sub.o test.o
SRC = add.o
SRC += sub.o
SRC += test.o

#两步编译.c->.o->exe
test:$(SRC)
	gcc ${SRC} -o $@
	#@echo $$+ = $+
	#@echo $^
	#@echo $<
add.o:add.c
	gcc -c $^ -o $@
	#echo $*
	#echo $@
sub.o:sub.c
	gcc -c $^ -o $@
test.o:test.c
	gcc -c $^ -o $@
#伪目标
.PHONY:clean
clean:
	rm *.o

四、Makefile的隐含变量

AR     库文件维护程序的名称,默认值为ar。

AS     汇编程序的名称,默认值为as。

CC     C编译器的名称,默认值为cc。

CPP   C预编译器的名称,默认值为$(CC)  –E。

CXX    C++ 编译器的名称,默认值为g++。

FC     FORTRAN编译器的名称,默认值为f77

RM     文件删除程序的名称,默认值为rm -f

ARFLAGS    库文件维护程序的选项,无默认值。

ASFLAGS    汇编程序的选项,无默认值。

CFLAGS     C编译器的选项,无默认值。

LDFLAGS      链接器的选项,无默认值

CPPFLAGS  C预编译的选项,无默认值。

CXXFLAGS  C++编译器的选项,无默认值。

FFLAGS  FORTRAN编译器的选项,无默认值

#隐含变量
#SRC = add.o sub.o test.o
SRC = add.o
SRC += sub.o
SRC += test.o

CC = gcc
#CC = arm-linux-gcc  你的环境如果没有该编译器,会报它找不到
CFLAGS = -c -g -Wall -I /home/linux/Makefile/include/

#两步编译.c->.o->exe
test:$(SRC)
	$(CC) ${SRC} -o $@
%.o:%.c
	$(CC) $(CFLAGS) $^ -o $@
#伪目标
.PHONY:clean
clean:
	$(RM) *.o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值