我是靠谱客的博主 甜甜秀发,最近开发中收集的这篇文章主要介绍Makefile常用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、makefile主要5个部分:

1.1、显示规则 :: 说明如何生成一个或多个目标文件(包括 生成的文件, 文件的依赖文件, 生成的命令)

1.2、隐晦规则 :: make的自动推导功能所执行的规则

1.3、变量定义 :: Makefile中定义的变量

1.4、文件指示 :: Makefile中引用其他Makefile; 指定Makefile中有效部分; 定义一个多行命令

1.5、注释 :: Makefile只有行注释 “#”, 如果要使用或者输出"#"字符, 需要进行转义, "#"

target ... : prerequisites ...

command ...

...

2、通配符:

* :表示任意一个或多个字符

? :表示任意一个字符

[...] :xx.[abcd]表示a,b,c,d中 的任意一个字符;[^abcd]表示除a,b,c,d以外的字符,[0~9]表示0~9任意一个数字

~ :表示用户的home目录

3、路径搜索

3.1 当前目录中找不到文件时, 按顺序从 src目录 ../parent-dir目录中查找文件

VPATH src:../parent-dir

3.2 .h结尾的文件都从 ./header 目录中查找

VPATH %.h ./header

3.3 清除示例2中设置的规则

VPATH %.h

3.4 清除所有VPATH的设置

VPATH

4、Makefile中的变量

4.1 变量定义(= or :=)

两者的区别: :=只能使用前面定义好的变量,=可以使用后面定义的变量

(1)

OBJS2 = $(OBJS1) programC.o

OBJS1 = programA.o programB.o

all:

@echo $(OBJS2)

执行make:

$make

programA.o programB.o programC.or

(2)

OBJS2 := $(OBJS1) programC.o

OBJS1 := programA.o programB.o

all:

@echo $(OBJS2)

执行make:

$make

programC.o

4.2 变量替换

# Makefile内容

SRCS := programA.c programB.c programC.c

OBJS := $(SRCS:%.c=%.o)

all:

@echo "SRCS: " $(SRCS)

@echo "OBJS: " $(OBJS)

# bash中运行make

$ make

SRCS: programA.c programB.c programC.c

OBJS: programA.o programB.o programC.o

4.3 变量追加值 +=

# Makefile内容

SRCS := programA.c programB.c programC.c

SRCS += programD.c

all:

@echo "SRCS: " $(SRCS)

# bash中运行make

$ make

SRCS: programA.c programB.c programC.c programD.c

4.4 变量覆盖 override

作用是使Makefile中定义的变量能够覆盖make命令参数中指定的变量

# Makefile内容 (没有用override)

SRCS := programA.c programB.c programC.c

all:

@echo "SRCS: " $(SRCS)

# bash中运行make

$ make SRCS=nothing

SRCS: nothing

#################################################

# Makefile内容 (用override)

override SRCS := programA.c programB.c programC.c

all:

@echo "SRCS: " $(SRCS)

# bash中运行make

$ make SRCS=nothing

SRCS: programA.c programB.c programC.c

4.5 目标变量

作用是使变量的作用域仅限于这个目标(target),而不是对整个Makefile都有效

# Makefile 内容

SRCS := programA.c programB.c programC.c

target1: TARGET1-SRCS := programD.c

target1:

@echo "SRCS: " $(SRCS)

@echo "SRCS: " $(TARGET1-SRCS)

target2:

@echo "SRCS: " $(SRCS)

@echo "SRCS: " $(TARGET1-SRCS)

# bash中执行make

$ make target1

SRCS: programA.c programB.c programC.c

SRCS: programD.c

$ make target2

SRCS: programA.c programB.c programC.c

SRCS:

5、Makefile命令前缀

可以加两种前缀 @和-,或者不用前缀

不用前缀:输出执行的命令以及命令执行结果,出错的话停止执行

@前缀:只输出命令执行的结果,出错的话停止执行

-前缀:命令执行有错的话,忽略错误,继续执行

6、伪目标

伪目标并不是一个“目标(target)”,不像真正的目标那样会生成一个目标文件

典型的伪目标是Makefile中用来清理编译过程中中间文件的clean伪目标

.PHONY: clean

clean:

-rm -f *.o

7、引用其他的Makefile

语法:include(filename 可以包含通配符和路径)

8、查看C文件的依赖关系

例子:

显示内核源码中virt/kvm/kvm_main.c 中的依赖关系

$ cd virt/kvm/

$ gcc -MM kvm_main.c

kvm_main.o: kvm_main.c iodev.h coalesced_mmio.h async_pf.h

最后

以上就是甜甜秀发为你收集整理的Makefile常用的全部内容,希望文章能够帮你解决Makefile常用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部