makefile整理01

转载 2015年07月10日 16:24:59

1.此时执行make命令,终端会显示系统执行的每条命令,如果你不想系统显示它执行的命令,在每条命令的前面加上“@”即可。


2.自动化变量
      模式规则中,规则的目标和依赖文件名代表了一类文件名;规则的命令是对所有这一类文件重建过程的描述,显然,在命令中不能出现具体的文件名,否则模式规则失去意义。
    假如你需要书写一个将.c 文件编译到.o 文件的模式规则,那么你该如何为gcc 书写正确的源文件名?当然了,不能使用任何具体的文件名,因为在每一次执行模式规则时源文件名都是不一样的。为了解决这个问题,就需要使用“自动环变量”,自动化变量的取值是根据具体所执行的规则来决定的,取决于所执行规则的目标和依赖文件名。

$@
表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。

$%
仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。

$<
依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。

$?
所有比目标新的依赖目标的集合。以空格分隔。

$^
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。

$+
这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。

$*
这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是make所能识别的后缀名,所以,"$*"的值就是"foo"。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用"$*",除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么"$*"就是空值。


"D"的含义就是Directory,就是目录,"F"的含义就是File,就是文件。

下面是对于上面的七个变量分别加上"D"或是"F"的含义:

$(@D)
表示"$@"的目录部分(不以斜杠作为结尾),如果"$@"值是"dir/foo.o",那么"$(@D)"就是"dir",而如果"$@"中没有包含斜杠的话,其值就是"."(当前目录)。

$(@F)
表示"$@"的文件部分,如果"$@"值是"dir/foo.o",那么"$(@F)"就是"foo.o","$(@F)"相当于函数"$(notdir $@)"。

"$(*D)"
"$(*F)"
和上面所述的同理,也是取文件的目录部分和文件部分。对于上面的那个例子,"$(*D)"返回"dir",而"$(*F)"返回"foo"

"$(%D)"
"$(%F)"
分别表示了函数包文件成员的目录部分和文件部分。这对于形同"archive(member)"形式的目标中的"member"中包含了不同的目录很有用。

"$(<D)"
"$(<F)"
分别表示依赖文件的目录部分和文件部分。

"$(^D)"
"$(^F)"
分别表示所有依赖文件的目录部分和文件部分。(无相同的)

"$(+D)"
"$(+F)"
分别表示所有依赖文件的目录部分和文件部分。(可以有相同的)

"$(?D)"
"$(?F)"
分别表示被更新的依赖文件的目录部分和文件部分。

最后想提醒一下的是,对于"$<",为了避免产生不必要的麻烦,我们最好给$后面的那个特定字符都加上圆括号,比如,"$(< )"就要比"$<"要好一些。

还得要注意的是,这些变量只使用在规则的命令中,而且一般都是"显式规则"和"静态模式规则"(参见前面"书写规则"一章)。其在隐含规则中并没有意义。



相关文章推荐

01-makefile样例

example01```Makefile objects=sort.o computer.o main.o CC=gcc CFLAGS=-wall -g example:$(objects) ...

make----关于makefile的学习与积累--01

理解:c,pc文件到可执行文件要经过,编译,链接。文件之间的依赖关系, 编译阶段主要是通过包含头文件来解决,链接阶段头文件中声明的那些方法都需要在指定的文件中找到,为了便于管理文件的依赖关系,应用时...

Error in invoking target 'client_sharedlib' of makefile '/u01/app/oracle/product/10.2.0/db_1/network

问题描述: Exception String: Error in invoking target 'client_sharedlib' of makefile '/u01/app/oracle/pr...

跟我一起写Makefile.陈皓.整理版

  • 2012年03月02日 12:34
  • 311KB
  • 下载

makefile写法整理

1  Makefile基本语法 Makefile:程序模块的内部关系决定了源程序编译和链接的顺序,通过建立makefile可以描述模块间的相互依赖关系。Make命令从中读取这些信息,然后根据这些信息...
  • crazybc
  • crazybc
  • 2012年07月02日 21:44
  • 1990

c++ 编译链接,makefile思路整理

长虹剑自己的一些经验总结,具体请自行根据实际情况决定。 (未完且待细节补充 ) - 2016-10-25 补充了一个makefile模板 - 2016-10-27 补充了cmake及cmake...

Makefile整理

1. 基本规则target : 依赖 命令make会由上往下的找target,也就是说,第一个target是最终目标。找到第一个target后,make寻找target文件,如果target不...

Makefile 学习整理

【说明】     开发人员在阅读或编写 Makefile时,可能会记不起某些知识点。     此文档目的是希望能起到提醒读者所遗忘的知识点的作用,故在整理时削弱了阅读流畅性,适用于对 Makefile...

跟我一起写 Makefile-------------------- 作者:陈皓 ---- 整理:祝冬华

跟我一起写 Makefile 作者:陈皓 跟我一起写 Makefile 作者:陈皓 整理:祝冬华 第 1 页共 78 页 2005 年 10 月 14 日整理:祝冬华跟我一起写 Makefil...

转贴(博主删节整理)——makefile 语法和写法

0.1  关于程序的编译和链接     在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:makefile整理01
举报原因:
原因补充:

(最多只允许输入30个字)