Makefile用法及变量

本文介绍了Makefile的基本概念,如其作为编译方法的高效性,基本语法结构(目标、依赖和命令),以及变量的使用、条件判断和函数。还涵盖了Make的使用选项,如指定Makefile路径和控制命令执行行为。
摘要由CSDN通过智能技术生成

Makefile概述

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

  makefile文件一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。再次编译,只编译修改的文件。提升了编译效率。

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

Makefile基本语法

target... : prerequisites ...       

      command                                   #ab键空下

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

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

command也就是make需要执行的命令。(任意的Shell命令)

make在解析makefile文件时只识别第一个目标,如果分多步要将最终目标放在第一个,或者在make后面加上目标,则单步执行该目标。如果目标与目录中文件名相同,需要在makefile文件中写下以下代码:
.PHONY:目标名                             #伪目标

Makefile的变量

Makefile创建变量的目的

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

1.系列文件的名字

2.传递给编译器的参数

3.需要运行的程序

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

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

6.你想做的其它事情。

自定义变量

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

$(x)或${x}              取值

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

makefile变量的赋值方式:

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

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

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

+=        追加赋值,旧值保持不变,将新值黏贴到旧值后面

自动变量

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

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

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

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

$@目标文件的完整名称

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

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

隐含变量

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

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

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

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

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

FC                  FORTRAN编译器的名称,默认值为f77RM文件删除程序的名称,默认值为rm -f

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

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

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

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

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

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

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

Makefile的条件判断

feq                  判断是否相等

ifneq               判断是否不相等

ifdef                判断是否定义过

ifndef              判断是否未定义过

Makefile的函数

基本语法:

$(<function> <arguments>)

或是

${<function> <arguments>}

常用函数

$(wildcard PATTERN)

功能:列出当前目录下所有符合模式“PATTERN”格式的文件名。

返回:空格分割的、存在当前目录下的所有符合模“PATTERN”的文件名。

说明:“PATTERN”使用shell可识别的通配符,包括“?”(单字符)、“*”(多字符)等。示例:$(wildcard *.c)返回值为当前目录下所有.c源文件列表。

$(patsubst <pattern>,<replacement>,<text>)

名称:模式字符串替换函数。

功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符%,表示任意长度的字串。如果<replacement>中也包含%,那么,<replacement>中的这个%将是<pattern>中的那个%所代表的字串。(可以用\来转义,以\%来表示真实含义的%字符)

返回:函数返回被替换过后的字符串。

自定义函数

$(call <expression>,<parm1>,<parm2>,<parm3>...)

Make的使用

-C           dir读入指定目录下的Makefile

-f             file读入当前目录下的file文件作为Makefile

-i             忽略所有的命令执行错误

-n            只打印要执行的命令,但不执行这些命令

-s            在执行命令时不显示命令

-w            如果make在执行过程中改变目录,打印当前目录名

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值