Makefile入门(四)

这篇将作为Makefile入门最后一篇,这个系列看完基本上可以看懂以及上手开始写项目需要的Makefile了。 

预处理

前面介绍了Makefile的各种结构,语法,命令,变量,以及各种规则。 但是除了通过target这种直接手动指定来实现的编译流程方法以外也能支持预处理的方式来进行控制构建流程,这和C/C++里面的#预编译指令一样,几乎有同样的功能,有对应的#include,#if 等,都有着类似的功能。这些指令都不具有实际构建的作用,但是可以帮助组织Makefile流程。

和C/C++的预处理指令以#开头不一样,Makefile用!开头。

从最简单的IF介绍起

条件预处理

        !IF,!ELSE,!ELSEIF,!ELSE IF, !ENDIF

其实用方法为类似于C/C++中的if语句非常简单,同样也是判断其后的表达式是否为非零。

这里用一个例子说明其使用方法:

OPTION=0
OPTION1=1

!IF $(OPTION)
all: 
	echo case 1
!ELSEIF $(OPTION1)    # 等同于!ELSE IF
all:
	echo case 2
!ELSE
all:
	echo case 3
!ENDIF

# 输出
case 2

        !IFDEF,!IFNDEF,!ELSEIFDEF, !ELSE IFDEF,!UNDEF

和!IF系列不同,这里的判断条件是是否宏被定义。使用和上面类似,唯一需要注意的是不需要加$()来强调这是一个被定义的宏。下列例子说明这个用法。

!IFDEF OPTION
all: 
	echo case 1
!ELSE
all:
	echo case 2
!ENDIF

# 输出
case 2

上面例子中就没有预先定义OPTION,所以输出的就是case 2。

!UNDEF就是可以将已经定义的宏取消。

!IF还能结合其他预处理操作符来实现除了值之外的功能

        DEFINED,EXIST,[]

这三个符号分别代表判断是否宏被定义,是否文件存在,以及程序的退出码。都会作为表达式范围相应的值配合!IF所使用,从而具有和外部环境交互的能力,从而动态控制构建流程。如下所示

!IF DEFINED (OPTION)
all:
	echo case 1
!ELSE
all: CASE_EXIST
	echo case 2
!ENDIF

!IF EXIST(file.cpp)
CASE_EXIST:
	echo case 3
!ENDIF

# 输出
case 3
case 2

显示信息预处理

!ERROR,!MESSAGE

当项目的Makefile变得很复杂的时候,特别是加上了子Makefile,有时候免不了自己都不清楚当前的Makefile所执行的流程,导致项目编译错误。这时候使用显示信息预处理就能加快调试定位问题。先看下面例子

!ERROR this is a error!
!MESSAGE just give you a tip.

all: 
	echo case 1

# 输出
just give you a tip.
makefile(2) : fatal error U1050: this is a error!
Stop.

  向上面的例子一样,显示信息预处理使用方法特别简单,直接将想要显示的文本加载其后。但是!MESSAGE不会打断NMAKE执行,可以等同于echo命令,只是显示一段信息。!ERROR则是会打断整个make的过程,并且其信息会被作为fatal error U1050输出。并且会指明该指令的行号。

包含指令

!INCLUDE等同于C/C++的#include,甚至语法上也能用<>来讲文件路径括起来。也是先来看例子

# 文件 makefile
all: sub
	echo this is main makefile

!INCLUDE <makefile1>

# 文件 makefile1
sub:
	echo sub makefile
    
# 输出
sub makefile
this is main makefile

如例子一样,非常类似于#include。

MAKE选项预编译 !CMDSWITCHES

在运行NMAKE的时候可以指定一些参数,例如/D参数可以在检查目标是否存在的同时将目标时间戳打出来。

!CMDSWITCHES  +d
all:
	echo this is main makefile

# 输出
周四, 9月 21 2022 21:05:58   all
'all' is up-to-date

因为已经有一个all文件存在了,因此并不会输出all里面的命令,同时会输出all文件的时间戳。等多的MAKE选项可以看NMAKE /?的帮助。

总结

介绍Makefile基本用法一共写了四篇,基本涵盖了普通项目所会遇到的所有方面。另外需要注意该介绍是以微软的nmake为例,其他平台的make可能写法稍有不同,但是各种概念基本一致。

如果遇到问题欢迎留言或私信交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Makefile是一种用来构建和管理程序的工具,它通过一个文本文件来指导编译器如何去编译、链接程序。理解并掌握Makefile的使用可以提高程序的编译效率和可维护性。下面是关于Makefile入门到精通的解释: 入门阶段: 在初学者阶段,需要掌握Makefile的基本语法和规则。学习如何编写一个简单的Makefile,并且能够使用Makefile来管理和编译一个简单的程序。掌握Makefile的目标、依赖关系、命令和变量的使用。 进阶阶段: 在进阶阶段,需要了解更多的Makefile的高级特性和技巧。学习如何使用条件语句、循环语句和函数来编写更灵活和复杂的Makefile。了解如何使用Makefile来管理多个源文件和目录结构。 精通阶段: 在精通阶段,需要深入理解Makefile背后的原理和机制。了解Makefile的工作原理,包括依赖关系的自动推导、文件更新的判断和并行编译等。还需要掌握一些高级的技巧,例如使用Makefile来实现代码自动生成、跨平台编译和项目的自动化构建等。 实践阶段: 在实践阶段,需要应用所学的知识来解决实际的编译和构建问题。学会分析和优化Makefile,以提高构建过程的效率和可维护性。实践中可能还需要了解如何与其他构建工具和版本控制系统进行集成,以及如何处理复杂的项目依赖关系。 总之,掌握Makefile需要从入门到精通经过一定的学习和实践过程。通过不断的学习和实践,逐渐提高对Makefile的理解和应用能力,才能真正驾驭Makefile并充分发挥其作用。 ### 回答2: Makefile是一种用于自动化编译和构建软件的脚本文件。它是基于依赖关系的构建工具,通过定义文件依赖关系和编译规则,可以自动检测源代码的变化并重新编译相关文件,从而提高软件开发的效率。 要学习Makefile,首先需要了解Makefile的基本语法和规则。Makefile由多个规则组成,每个规则包含目标文件、依赖文件和命令。目标文件是生成的文件,依赖文件是生成目标文件所需的源文件或其他目标文件,命令是生成目标文件的具体步骤。 在Makefile中,可以定义变量来存储常用的路径或编译选项,这样可以方便地在多个规则中复用。还可以使用条件判断、循环和函数等高级语法来实现更复杂的功能。 经常使用的命令有make、make clean和make install。make命令用于编译源代码并生成目标文件,如果源文件有更新,make会自动重新编译相关文件。make clean命令用于清理生成的目标文件和临时文件,make install命令用于安装生成的可执行文件或库文件到指定位置。 学习Makefile还需要掌握一些常用的编译规则和选项。例如,可以通过定义编译规则来指定编译器、编译选项和链接选项。可以使用特殊变量$@表示目标文件,$^表示所有的依赖文件,$<表示第一个依赖文件。还可以使用通配符和模式匹配来处理多个文件或目录。 除了基本的语法和规则,还可以学习一些高级的技巧和技术,例如使用配置文件、自动化测试、并行编译等。通过不断实践和积累经验,可以逐渐提高对Makefile的掌握程度,从入门到精通。 总结来说,要从入门到精通Makefile,需要掌握基本的语法和规则,学习常用的命令和选项,并通过实际项目的练习来加深理解和提高技能水平。 ### 回答3: makefile是一种用于自动化构建和管理项目的工具。它可以根据一组规则,自动推断出需要重新编译的文件,并且根据这些规则自动执行相应的指令,从而简化了项目的构建流程和维护工作。 首先,我们需要了解makefile的基本语法和组成部分。makefile由一系列规则组成,每个规则包含一个目标、依赖关系和执行的指令。目标是需要生成的文件,依赖关系是该文件生成所依赖的文件,指令则是实际执行的操作。 其次,学习makefile中的变量。变量可以用于存储常用的路径、命令等信息。使用变量可以简化项目配置和维护,提高可维护性。 然后,理解makefile中的模式规则。模式规则是一种通用的规则,可以根据目标和依赖的模式,推断出需要执行的指令。使用模式规则可以减少重复的规则定义,提高makefile的灵活性。 接下来,学习条件判断和循环控制。条件判断可以根据不同的情况选择执行不同的指令,循环控制可以重复执行某些指令。这些功能可以使makefile更加灵活和自动化。 最后,掌握makefile中的常用函数和命令。makefile提供了一系列内置函数和命令,用于处理文本、路径、文件等操作。熟练掌握这些函数和命令,可以提高makefile的处理能力和效率。 总结而言,要精通makefile需要掌握其基本语法、规则定义、变量使用、模式规则、条件判断、循环控制、内置函数和命令等知识。通过实践和不断学习,掌握这些内容后,就可以灵活运用makefile来构建和管理项目,提高开发效率和代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值