专题 19 Makefile的使用

本文详细介绍Makefile的基础概念、选项及变量使用方法,并通过实例演示如何构建项目,包括编译、清理等操作。

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

  1. 认识Makefile

Make工具的使用格式:

make[options] [target]


选   

含   

-ffilename

显式地指定文件作为Makefile

-Cdirname

制定make在开始运行后的工作目录为dirname

-e

不允许在Makefile中替换环境变量的赋值

-k

执行命令出错时,放弃当前目标,继续维护其他目标

-n

按实际运行时的执行顺序模拟执行命令(包括用@开头的命令),没有实际执行效果,仅仅用于显示执行过程

-p

显示Makefile中所有的变量和内部规则

-r

忽略内部规则

-s

执行但不显示命令,常用来检查Makefile的正确性

-S

如果执行命令出错就退出

-t

修改每个目标文件的创建日期

-I

忽略运行make中执行命令的错误

-V

显示make的版本号

Makefile的常用变量:

变量

描述

$@

目标文件名

$<

规则中的第一个文件名

$^

规则中所有的依赖文件名

$?

规则中日期比目标新的文件列表,用空格隔开

$(@D)

目标文件的目录部分

$(@F)

目录文件的文件名部分

Makefile中,目标名称的指定常常有以下惯例:

all:表示编译所有的内容,是执行make时默认的目标。

clean:表示清除目标。

distclean:表示清除所有的内容。

install:表示进行安装的内容。

  1. Makefile的使用范例

  1. 最简单的例子

    all:

    @echo"+++++++ make all +++++++"

    rule0:

    @echo"Input = $(INPUT)"

    @echo'This Target is $@'

    .PHONY: clean

    clean:

    @echo"------- clean ------"


  2. Makefile中的依赖关系

all:rule0file.o

rule0:rule1

@echo"+++++++ rule0 +++++++"

@echo'The deps:$^'

@echo'The target:$@'

rule1:rule2

@echo"+++++++ rule1 +++++++"

rule2:rule3

@echo"+++++++ rule2 +++++++"

rule3:

@echo"+++++++ rule3 +++++++"

file.o:

@echo"1234567890" > file.o

@echo"File path: $(@D) File name : $(@F)"

.PHONY: clean rule0 rule1 rule2 rule3

clean:

@echo"------- clean ------"

rm -f file.o

Makefile的执行顺序不是按照每条规则书写的先后顺序,而是由规则之间的依赖关系确定的。在Makefile中,将目标cleanrule0 rule1 rule2rule3定义为伪目标(.PHONY),这是由于它们不是需要生成的内容的名称;file.o是实际生成的结果,因此它是真实的目标,而不是伪目标。


  1. Makefile的隐含规则

CC := gcc

HEAD := getarg.h

SRC := getarg.c writeinfo.o main.c

OBJS := getarg.o writeinfo.o main.o

TT := test

Files:= $(wildcard ./*)

INC= .

CFLAGS = -pipe -g -Wall -I$(INC)

LDFLAGS= -Wall -g


all:$(TT)

$(TT):$(OBJS)

@echo"+++++++ Build Standalone Programe : $@ +++++++"

$(CC)$(LDFLAGS) $(OBJS) -o $@

libtest_d.so:getarg.owriteinfo.o

@echo"+++++++ Build Dynamic lib : $@ +++++++"

$(CC)-shared $(LDFLAGS) getarg.o writeinfo.o -o $@


test_dlib:libtest_d.somain.o

@echo"+++++++ Build Exe by Dynamic lib : $@ +++++++"

$(CC)$(LDFLAGS) main.o -L. -ltest_d -o $@


filelist:

@echo"<<<<<<< Files in this folder >>>>>>"

@file$(Files)


.PHONY: clean filelist


%.o:%c

$(CC)$(CFLAGS) -c $< -o $@

clean:

@echo"------- clean ------"

rm-f *.o

rm-f $(TT)

rm-f libtest_d.so

rm -f test_dlib



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值