Linux学习6--Makefile

2022/3/7 7:20:12

本文主要是介绍Linux学习6--Makefile,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Linux学习6--Makefile

  • 一、Makefile
    • 1、Make简介
    • 2、Makefile基本结构
  • 二、Makefile变量
    • 1、创建和使用变量
  • 三、Make的用法
    • 1、Make使用
    • 2、Makefile的隐含规则
  • 四、VPATH的用法


一、Makefile

1、Make简介

 (1)工程管理器,顾名思义,是指管理较多的文件 
 (2)Make工程管理器也就是个“自动编译管理器”。
 	这里的“自动”是指它能够根据文件时间戳,
    自动发现更新过的文件而减少编译的工作量,
    同时,它通过读入Makefile文件的内容来执行大量的编译工作 
 (3)Make将只编译改动的代码文件,而不用完全编译。

2、Makefile基本结构

MakefileMake读入的唯一配置文件。

  • make工具创建的目标体(target),通常是目标文件可执行文件
  • 要创建的目标体所依赖的文件(dependency_file)
  • 创建每个目标体时需要运行的命令(command)

注意:命令行前面必须是一个”TAB键”,否则编译错误为:*** missing separator. Stop.

Makefile格式:

	target  :   dependency_files
	<TAB>  command
	例子
	hello.o :  hello.c hello.h
	    gcc  –c  hello.c  –o  hello.o

二、Makefile变量

1、创建和使用变量

(1)创建变量的目的
用来代替一个文本字符串,字符串可以是:

 系列文件的名字  
 传递给编译器的参数 
 需要运行的程序 
 需要查找源代码的目录 
 你需要输出信息的目录  
 你想做的其它事情 

(2) 变量定义的两种方式

		递归展开方式 VAR=var
        简单方式 VAR:=var

变量使用: $ (VAR)
如果要使用” $ ”则用”$$”来表示。
变量类似于编程语言中的宏。

例子:

OBJS = kang.o yul.o
CC = gcc
	CFLAGS = -Wall -O -g
sunq : $(OBJS)
	$(CC) $(OBJS) -o sunq
kang.o : kang.c kang.h
    $(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
    $(CC) $(CFLAGS) -c yul.c -o yul.o

(3)用?=定义变量

	dir := /foo/bar
	FOO ?= bar
	FOO是? 	        

含义是,如果FOO没有被定义过,那么变量FOO的值就是bar,如果FOO先前被定义过,那么这条语将什么也不做。


(4)变量添加值
你可以通过+=为已定义的变量添加新的值
例如:

Main=hello.o hello-1.o
Main+=hello-2.o

(5)默认变量

AR:  库文件维护程序的名称,默认值为ar。AS汇编程序的名称,默认值为as。
CC:  C编译器的名称,默认值为cc。CPP  C预编译器的名称,默认值为$(CC) –E。
CXX: C++编译器的名称,默认值为g++。
FC:  FORTRAN编译器的名称,默认值为f77
RM:  文件删除程序的名称,默认值为rm -f

例如:

	Hello: main.c main.h 
	<tab> $(CC) –o hello main.c
	clean:
	<tab> $(RM) hello	

(6)预定义变量

	ARFLAGS 	 库文件维护程序的选项,无默认值。
	ASFLAGS 	 汇编程序的选项,无默认值。
	CFLAGS  	 C编译器的选项,无默认值。
	CPPFLAGS	 C预编译的选项,无默认值。
	CXXFLAGS	 C++编译器的选项,无默认值。
	FFLAGS		 FORTRAN编译器的选项,无默认值。

例如:

OBJS = kang.o yul.o
CC = gcc	
CFLAGS = -Wall -O -g
sunq : $(OBJS)
    $(CC) $(OBJS) -o sunq
kang.o : kang.c kang.h
    $(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
    $(CC) $(CFLAGS) -c yul.c -o yul.o

(7)自动变量

  • $* 不包含扩展名的目标文件名称
  • $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
  • $< 第一个依赖文件的名称
  • $? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
  • $@ 目标文件的完整名称
  • $^ 所有不重复的目标依赖文件,以空格分开
  • $% 如果目标是归档成员,则该变量表示目标的归档成员名称
    例如
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
    $(CC) $^ -o $@
kang.o : kang.c kang.h 
    $(CC) $(CFLAGS) -c $< -o $@
yul.o : yul.c yul.h
    $(CC) $(CFLAGS) -c $< -o $@

备注:make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量。
如果用户在Makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量


三、Make的用法

1、Make使用

直接运行make

选项
	-C dir读入指定目录下的Makefile
	-f  file读入当前目录下的file文件作为Makefile
	-i忽略所有的命令执行错误
	-I dir指定被包含的Makefile所在目录
	-n只打印要执行的命令,但不执行这些命令
	-p显示make变量数据库和隐含规则	
	-s在执行命令时不显示命令
	-w如果make在执行过程中改变目录,打印当前目录名

2、Makefile的隐含规则

隐含规则1:编译C程序的隐含规则

“<n>.o”的目标依赖目标会自动推导为“<n>.c”
并且其自动生成命令是“$(CC) -c $(CPPFLAGS) $(CFLAGS)”

隐含规则2:链接Object恩建的隐含规则

“<n>”目标依赖于“<n>.o”,
通过运行C的编译器来运行链接程序生成(一般是“ld”),
其自动生成命令是:“$(CC) $(LDFLAGS) <n>.o”
“$(LOADLIBES) $(LDLIBS)”,这个规则对于只有一个源文件的工程有效,同时也对多个Object文件(由不同的源文件生成)的也有效

例如如下:

	x:x.o y.o z.o
	并且“x.c”、“y.c”和“z.c”都存在时,隐含规则将自动执行如下命令:
	cc -c x.c -o x.o
	cc -c y.c -o y.o
	cc -c z.c -o z.o
	cc x.o y.o z.o -o x

四、VPATH的用法

VPATH:虚路径

 (1)在一些大的工程中,有大量的源文件.
 我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。
 所以,当make需要去寻找文件的依赖关系,你可以在文件
 前加上路径,但最好的方法是把一个路径告诉make,让make在自动去找。
 (2)Makefile文件中的特殊变量“VPTH”就是文成这个功能的.
 如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。
 如果定义了这个变量,那么make就会在当前
 目录找不到的情况下,到所指定的目录中去找寻文件了。
 (3) VPATH = src:../headers
 (4) 上面的定义指定两个目录,“src”和“../headers”,
 make会按照这个顺序进行搜索。
 目录由“冒号”分隔。当然,当目前目录永远是最高的优先搜索的地方

到这里就结束啦~
在这里插入图片描述



这篇关于Linux学习6--Makefile的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程