Makefile的宏分为俩种:普通的宏和特殊的宏

  • 普通的宏:

    Makefile中普通的宏类似于变量。可以使用类似于下例的方式来定义:

    MACROS  = -me         #后续需要使用 -me时 可以使用 MACROS 与一些运算符进行配合使用
    #例如:
    $(MACROS)             #主要用于增加代码的可读性
    PSROFF  = groff -Tps
    DITROFF = groff -Tdvi
    CFLAGS  = -O -systype bsd43
    LIBS    = "-lncurses -lm -lsdl"    #编译当中使用了哪些库 也可以使用宏来进行替换,#这样就大大的减少了代码的复杂度,让代码更加容易理解。
    LIBS   += -lstdc++                 #可以使用运算往宏的内容中追加内容
    MYFACE  = ":*)"
    #使用示例
    $(MYFACE)   #增加了可阅读性  Myface(笑脸) = ":*)" 可以放其他使用者很快的明白其中的意义#宏可以随意命名
    #例如:
    PROJ_HOME = /home/lavendercc/projects      #使用宏来替换具体路径,同样增加了代码的可读性#同时也减少了代码的复杂度#调用方法  $(宏的名称)
    #例如:
    $(PROJ_HOME)
    

注意点:一旦宏被定义了,在这个宏之前同名的定义都将作废。

  • 特殊的宏

    在目标规则集发出任何命令之前,有一些特殊的宏

$@   #表示目标文件
$?   #表示比目标文件还要新的依赖文件列表

可以使用下面一个例子来测试一下:

hello: main.cpp hello.cpp factorial.cpp$(CC) $(CFLAGS) $? $(LDFLAGS) -o $@
#hello                                 编译生成的执行文件名
#main.cpp hello.cpp factorial.cpp      编译所需要的条件(文件)
#$(CC) $(CFLAGS) $? $(LDFLAGS) -o $@   编译所要执行的规则
#$@ 代替的 hello 这个目标文件   CC表示进行的是 C++ 的编译
#$? 会将所需要的条件(文件)按顺序填入(如果其中有文件的修改时间比目标文件更新,#则修改时间比目标文件旧的文件不会被编译,修改时间比目标文件新的会进行编译
alternatively:hello: main.cpp hello.cpp factorial.cpp$(CC) $(CFLAGS) $@.cpp $(LDFLAGS) -o $@
#$@ 将hello 下面所依赖的 .cpp文件全部进行编译#(不存在时间筛选,每次编译时都会将全部 .cpp文件都再次编译一次)

常用的一些特殊的宏:

#俩个特殊的隐含规则中使用的宏
$<   #表示第一个依赖文件
$*   #这个变量表示目标模式中 "%"及其之前的部分
#注意点:如果目标模式是Make工具可以天然识别的模式可以不需要 %符号也可以进行识别#例如:
#对于$* 如果目标是"dir/a.foo.b",并且目标模式是"a.%.b",那么"$*"的值就是"dir/a.foo"#(%之前的所有文件)。
#如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是Make所识别的,#那么"$*"就是除了后缀的那一部分。
#例如:
#如果目标是 "foo.c",因为".c"是Make所能识别的后缀名,所以"$*"的值就是"foo"
#这个特性是GNU make的,很有可能不兼容于其他版本的make,所以应该尽量避免使用"$*",
#除非在隐含规则或是静态模式中。如果目标中的后辍是make所不能识别的,那么"$*"就是空值。
#使用示例:
.o.cpp:$(CC) $(CFLAGS) -c $<
#常见的隐含规则的构造 .o(对象)文件 , .cpp(源文件)
#$< 相当于  main.cpp ==   $*.cpp
alternatively:.o.cpp:$(CC) $(CFLAGS) -c $*.cpp
  • 传统的宏

          在Makefile中有许多传统的默认宏(输入”make -p“打印出来的默认值)。大多数情况下它们使用的规则是很明显的:这些预定义变量,即:在隐含规则中使用的宏分为俩大类:
    
    • 程序名(例如CC)
    • 含有参数的程序(如CFLAGS)

以下是一些用作 Makefile 内置规则中程序名称的常用变量表。
1、关于命令的变量。

AR

 函数库打包程序。默认命令是“ar”。

AS

汇编语言编译程序。默认命令是“as”。

CC

C语言编译程序。默认命令是“cc”。

CXX

C++语言编译程序。默认命令是“g++”。

CO

从 RCS文件中扩展文件程序。默认命令是“co”。

CPP

C程序的预处理器(输出是标准输出设备)。默认命令是“$(CC) –E”。

FC

Fortran 和 Ratfor 的编译器和预处理程序。默认命令是“f77”。

GET

从SCCS文件中扩展文件的程序。默认命令是“get”。

LEX

Lex方法分析器程序(针对于C或Ratfor)。默认命令是“lex”。

PC

Pascal语言编译程序。默认命令是“pc”。

YACC

Yacc文法分析器(针对于C程序)。默认命令是“yacc”。

YACCR

Yacc文法分析器(针对于Ratfor程序)。默认命令是“yacc –r”。

MAKEINFO

转换Texinfo源文件(.texi)到Info文件程序。默认命令是“makeinfo”。

TEX

从TeX源文件创建TeX DVI文件的程序。默认命令是“tex”。

TEXI2DVI

从Texinfo源文件创建军TeX DVI 文件的程序。默认命令是“texi2dvi”。

WEAVE

转换Web到TeX的程序。默认命令是“weave”。

CWEAVE

转换C Web 到 TeX的程序。默认命令是“cweave”。

TANGLE

转换Web到Pascal语言的程序。默认命令是“tangle”。

CTANGLE

转换C Web 到 C。默认命令是“ctangle”。

RM

删除文件命令。默认命令是“rm –f”。

2、关于命令参数的变量
下面的这些变量都是相关上面的命令的参数。如果没有指明其默认值,那么其默认值都是空。
ARFLAGS

函数库打包程序AR命令的参数。默认值是“rv”。

ASFLAGS

汇编语言编译器参数。(当明显地调用“.s”或“.S”文件时)。

CFLAGS

C语言编译器参数。

CXXFLAGS

C++语言编译器参数。

COFLAGS

RCS命令参数。

CPPFLAGS

C预处理器参数。( C 和 Fortran 编译器也会用到)。

FFLAGS

Fortran语言编译器参数。

GFLAGS

SCCS “get”程序参数。

LDFLAGS

链接器参数。(如:“ld”)

LFLAGS

Lex文法分析器参数。

PFLAGS

Pascal语言编译器参数。

RFLAGS

Ratfor 程序的Fortran 编译器参数。

YFLAGS

Yacc文法分析器参数。

注 - 你可以使用 -R 或 --no-builtin-variables 选项取消隐式规则使用的所有变量。

//例如make CPP = /home/lavendercc/projects

Makefile的宏相关推荐

  1. Linux学习笔记——例说makefile 增加宏定义

    从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makef ...

  2. Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D

    在源代码里面如果这样是定义的: #ifdef   MACRONAME //可选代码 #endif 那在makefile里面 gcc   -D   MACRONAME=MACRODEF 或者 gcc   ...

  3. makefile使用宏及用法$(宏标识符) $(cc)_宏编程的艺术

    微信限制:不能放置链接,代码样式比较奇怪,发布后不能更新... 推荐 阅读原文: 写在前面 之前写过几篇关于 C/C++ 宏 (macro) 和 C++ 元编程 (metaprogramming) 的 ...

  4. linux 多线程聚集写程序,Linux篇二:Makefile写多线程多文件程序-Go语言中文社区...

    距离上次布置任务已经两个周了,虽然这是自己的业余学习,还是为自己的工作时间安排表示有待提高.. 废话不多说,直接上干货. 这次老师布置的任务要求是,Makefile写多线程.多文件调用.用上数学函数. ...

  5. Makefile学习笔记-备忘

    2019独角兽企业重金招聘Python工程师标准>>> ##makefile学习 makefile是编译C和C++文件依赖的脚本文件 ###基本语法 target... : prer ...

  6. linux环境cpp/c文件的makefile编写(caffe举例)

    编译单个cpp文件 方法一.g++ 文件名.cpp,生成一个名为 "文件名.out" 的可执行文件 方法二.g++ -c 文件名.cpp -o 新文件名.o:生成一个被命名成 &q ...

  7. Linux基础知识汇总(2)...持续更新中

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  8. linux驱动位置_Linux驱动程序学习一 (续)

    继续linux设备驱动程序第二章的学习实践. 一.当前进程 查找当前进程. 在hello.c中增加以下代码: printk(KERN_EMERG "the process is " ...

  9. c语言fscanf 发生段错误,亚嵌教育

    亚嵌教育 46期C语言复习串讲课堂笔记 (2012-2-20) 知识点汇总 (以下知识点内容基本按照<一站式编程>章节顺序) 程序概念 指令 (代码段) 函数调用 printf() 运算( ...

最新文章

  1. 2021年春季学期-信号与系统-第八次作业参考答案-第十二小题
  2. OpenKruise v1.0:云原生应用自动化达到新的高峰
  3. Visual Studio 2010 旗舰版安装图解
  4. LUA面向对象编程技巧
  5. 集成Dapr的 Azure 容器应用
  6. 阿里的程序员们如何解决复杂数据的查询优化问题?| 技术头条
  7. python快速求EXCEL数据权重
  8. linux安装openssl、swoole等扩展的具体步骤
  9. 尚硅谷2022 jenkins教程笔记
  10. Fgui: Glist 实现无限滑动 虚拟列表
  11. 【教程】迅为iTOP-4412精英版exynos4412开发板搭建原生Linux最小系统(四)
  12. 计算机休眠唤醒后 网络受限,彻底解决win10系统待机、休眠被唤醒后笔记本WIFI无线网无法连接的问题-网络教程与技术 -亦是美网络...
  13. vue-baidu-map + mapv 实现百度地图迁徙图动效
  14. dell 台式电脑设置每天定时开机和关机
  15. win10系统关机被阻止解决方法
  16. python字符串前加字母u或者r区
  17. 上半年计算机二级试题,2016上半年计算机二级模拟题及答案
  18. c、c++的getchar()函数
  19. 白盒测试(单元测试JUnit使用断言assertThat中startsWith、endsWith方法)
  20. python join函数报错_python中join()函数的使用方法

热门文章

  1. java removeattribute_JS removeAttribute()方法实现删除元素的某个属性
  2. CMOS单刀单掷开关(SPST)笔记
  3. EPIC无法登录 无法连接服务器解决办法
  4. 服务器内部转发以及客户端重定向
  5. 公路车骑行耳机推荐,分享五款适合公路骑车的耳机
  6. 为嵌入式linux添加网络功能并用tftp传输文件(以ZYNQ为例)
  7. C# beginInvoke
  8. 机械制图及计算机绘图试题库,201机械制图及计算机绘图2试题库概述.doc
  9. 国内共享软件的十大杀手
  10. strcpy函数的用法