Makefile的宏
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的宏相关推荐
- Linux学习笔记——例说makefile 增加宏定义
从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makef ...
- Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D
在源代码里面如果这样是定义的: #ifdef MACRONAME //可选代码 #endif 那在makefile里面 gcc -D MACRONAME=MACRODEF 或者 gcc ...
- makefile使用宏及用法$(宏标识符) $(cc)_宏编程的艺术
微信限制:不能放置链接,代码样式比较奇怪,发布后不能更新... 推荐 阅读原文: 写在前面 之前写过几篇关于 C/C++ 宏 (macro) 和 C++ 元编程 (metaprogramming) 的 ...
- linux 多线程聚集写程序,Linux篇二:Makefile写多线程多文件程序-Go语言中文社区...
距离上次布置任务已经两个周了,虽然这是自己的业余学习,还是为自己的工作时间安排表示有待提高.. 废话不多说,直接上干货. 这次老师布置的任务要求是,Makefile写多线程.多文件调用.用上数学函数. ...
- Makefile学习笔记-备忘
2019独角兽企业重金招聘Python工程师标准>>> ##makefile学习 makefile是编译C和C++文件依赖的脚本文件 ###基本语法 target... : prer ...
- linux环境cpp/c文件的makefile编写(caffe举例)
编译单个cpp文件 方法一.g++ 文件名.cpp,生成一个名为 "文件名.out" 的可执行文件 方法二.g++ -c 文件名.cpp -o 新文件名.o:生成一个被命名成 &q ...
- 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 ...
- linux驱动位置_Linux驱动程序学习一 (续)
继续linux设备驱动程序第二章的学习实践. 一.当前进程 查找当前进程. 在hello.c中增加以下代码: printk(KERN_EMERG "the process is " ...
- c语言fscanf 发生段错误,亚嵌教育
亚嵌教育 46期C语言复习串讲课堂笔记 (2012-2-20) 知识点汇总 (以下知识点内容基本按照<一站式编程>章节顺序) 程序概念 指令 (代码段) 函数调用 printf() 运算( ...
最新文章
- 2021年春季学期-信号与系统-第八次作业参考答案-第十二小题
- OpenKruise v1.0:云原生应用自动化达到新的高峰
- Visual Studio 2010 旗舰版安装图解
- LUA面向对象编程技巧
- 集成Dapr的 Azure 容器应用
- 阿里的程序员们如何解决复杂数据的查询优化问题?| 技术头条
- python快速求EXCEL数据权重
- linux安装openssl、swoole等扩展的具体步骤
- 尚硅谷2022 jenkins教程笔记
- Fgui: Glist 实现无限滑动 虚拟列表
- 【教程】迅为iTOP-4412精英版exynos4412开发板搭建原生Linux最小系统(四)
- 计算机休眠唤醒后 网络受限,彻底解决win10系统待机、休眠被唤醒后笔记本WIFI无线网无法连接的问题-网络教程与技术
-亦是美网络...
- vue-baidu-map + mapv 实现百度地图迁徙图动效
- dell 台式电脑设置每天定时开机和关机
- win10系统关机被阻止解决方法
- python字符串前加字母u或者r区
- 上半年计算机二级试题,2016上半年计算机二级模拟题及答案
- c、c++的getchar()函数
- 白盒测试(单元测试JUnit使用断言assertThat中startsWith、endsWith方法)
- python join函数报错_python中join()函数的使用方法