cad常用命令大全图表行方式并没有因为视窗系统的便利而停止发展对吗

最近实习要求在服务器开发,之前茬本地开发习惯了,由于不熟悉linuxcad常用命令大全图表,效率很低,经过这两天总结一下最常用的cad常用命令大全图表…
那些花里胡哨的遇到可以百度 呮记住用到的80%即可,不必为了另外的20%浪费80%的时间

cat file1 从第一个字节开始正向查看文件的内容

}

Makecad常用命令大全图表完全详解教程

無论是在Linux还是在Unix环境中make都是一个非常重要的编译cad常用命令大全图表。不管是自己进行项目开发还是安装应用软件我们都经常要用到make或make install。利用make工具我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序使用make和makefile工具就可以简潔明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件如果每次都要键入gcccad常用命令大全图表进行编译的话,那对程序員来说简直就是一场灾难而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译因此,有效的利用make囷makefile工具可以大大提高项目开发的效率同时掌握make和makefile之后,您也不会再面对着Linux下的应用软件手足无措了

一、Make程序的cad常用命令大全图表行选項和参数

Makecad常用命令大全图表参数的典型序列如下所示:

这里用[]括起来的表示是可选的。cad常用命令大全图表行选项由破折号“–”指明后媔跟选项,如

如果需要多个选项可以只使用一个破折号,如

也可以每个选项使用一个破折号如

Makecad常用命令大全图表本身的cad常用命令大全圖表行选项较多,这里只介绍在开发程序时最为常用的三个它们是:

如果使用该选项,即使make程序遇到错误也会继续向下运行;如果没有該选项在遇到第一个错误时make程序马上就会停止,那么后面的错误情况就不得而知了我们可以利用这个选项来查出所有有编译问题的源攵件。

该选项使make程序进入非执行模式也就是说将原来应该执行的cad常用命令大全图表输出,而不是执行

指定作为makefile的文件的名称。 如果不鼡该选项那么make程序首先在当前目录查找名为makefile的文件,如果没有找到它就会转而查找名为Makefile的文件。如果您在Linux下使用GNU Make的话它会首先查找GNUmakefile,之后再搜索makefile和Makefile按照惯例,许多Linux程序员使用Makefile因为这样能使Makefile出现在目录中所有以小写字母命名的文件的前面。所以最好不要使用GNUmakefile这一洺称,因为它只适用于make程序的GNU版本

当我们想构建指定目标的时候,比如要生成某个可执行文件那么就可以在makecad常用命令大全图表行中给絀该目标的名称;如果cad常用命令大全图表行中没有给出目标的话,makecad常用命令大全图表会设法构建makefile中的第一个目标我们可以利用这一特点,将all作为makefile中的第一个目标然后将让目标作为all所依赖的目标,这样当cad常用命令大全图表行中没有给出目标时,也能确保它会被构建

上媔提到,makecad常用命令大全图表对于构建具有多个源文件的程序有很大的帮助事实上,只有makecad常用命令大全图表还是不够的前面说过还必用須makefile告诉它要做什么以及怎么做才行,对于程序开发而言就是告诉makecad常用命令大全图表应用程序的组织情况。

我们现在对makefile的位置和数量简单說一下一般情况下,makefile会跟项目的源文件放在同一个目录中另外,系统中可以有多个makefile一般说来一个项目使用一个makefile就可以了;如果项目佷大的话,我们就可以考虑将它分成较小的部分然后用不同的makefile来管理项目的不同部分。

makecad常用命令大全图表和Makefile配合使用能给我们的项目管理带来极大的便利,除了用于管理源代码的编译之外还用于建立手册页,同时还能将应用程序安装到指定的目录

因为Makefile用于描述系统Φ模块之间的相互依赖关系,以及产生目标文件所要执行的cad常用命令大全图表所以,一个makefile由依赖关系和规则两部分内容组成下面分别加以解释。

依赖关系由一个目标和一组该目标所依赖的源文件组成这里所说的目标就是将要创建或更新的文件,最常见的是可执行文件规则用来说明怎样使用所依赖得文件来建立目标文件。

当makecad常用命令大全图表运行时会读取makefile来确定要建立的目标文件或其他文件,然后對源文件的日期和时间进行比较从而决定使用那些规则来创建目标文件。一般情况下在建立起最终的目标文件之前,肯定免不了要建竝一些中间性质的目标文件这时,Makecad常用命令大全图表也是使用makefile来确定这些目标文件的创建顺序以及用于它们的规则序列。

make程序自动生荿和维护通常是可执行模块或应用程序的目标目标的状态取决于它所依赖的那些模块的状态。Make的思想是为每一块模块都设置一个时间标記然后根据时间标记和依赖关系来决定哪一些文件需要更新。一旦依赖模块的状态改变了make就会根据时间标记的新旧执行预先定义的一組cad常用命令大全图表来生成新的目标。

依赖关系规定了最终得到的应用程序跟生成它的各个源文件之间的关系如下面的图1描述了可执行攵件main对所有的源程序文件及其编译产生的目标文件之间的依赖关系,见下图:

图1  模块间的依赖关系

h在makefile中,我们可以用目标名称加冒号,后跟空格键或tab键再加上由空格键或tab键分隔的一组用于生产目标模块的文件来描述模块之间的依赖关系对于上例来说,可以作以下描述:

不难发现上面的各个源文件跟各模块之间的关系具有一个明显的层次结构,如果def2.h发生了变化那么就需要更新f1.o和f2.o,而f1.o和f2.o发生了变化的話那么main也需要随之重新构建。

默认时make程序只更新makefile中的第一个目标,如果希望更新多个目标文件的话可以使用一个特殊的目标all,假如峩们想在一个makefile中更新main和hello这两个程序文件的话可以加入下列语句达到这个目的:

实际上,makefile是以相关行为基本单位的相关行用来描述目标、模块及规则(即cad常用命令大全图表行)三者之间的关系。一个相关行格式通常为:冒号左边是目标(模块)名;冒号右边是目标所依赖嘚模块名;紧跟着的规则(即cad常用命令大全图表行)是由依赖模块产生目标所使用的cad常用命令大全图表相关行的格式为:

习惯上写成多荇形式,如下所示:

目标(TARGET)程序产生的文件如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”

依赖(DEPENDENCIES)是用来产生目標的输入文件,一个目标通常依赖于多个文件

cad常用命令大全图表(COMMAND)是make执行的动作,一个可以有多个cad常用命令大全图表每个占一行。紸意:每个cad常用命令大全图表行的起始字符必须为TAB字符!

有依赖关系规则中的cad常用命令大全图表通常在依赖文件变化时负责产生target文件make执荇这些cad常用命令大全图表更新或产生target。规则可以没有依赖关系如包含target “clean”的规则。

规则解释如何和何时重做该规则中的文件make根据依赖關系执行产生或更新目标;规则也说明如何和何时执行动作。有的规则看起来很复杂但都符合上述模式。

需要注意的是如果相关行写荿一行,“cad常用命令大全图表”之前用分号“;”隔开如果分成多行书写的话,后续的行务必以tab字符为先导对于makefile而言,空格字符和tab字苻是不同的所有规则所在的行必须以tab键开头,而不是空格键初学者一定对此保持警惕,因为这是新手最容易疏忽的地方因为几个空格键跟一个tab键在肉眼是看不出区别的,但makecad常用命令大全图表却能明察秋毫

此外,如果在makefile文件中的行尾加上空格键的话也会导致makecad常用命囹大全图表运行失败。所以大家一定要小心了,免得耽误许多时间

例,一个名为prog的程序由三个C源文件filea.c、fileb.c和filec.c以及库文件LS编译生成这三個文件还分别包含自己的头文件a.h

  那么下面的文档就描述了这些文件之间的相互联系:

这个描述文档就是一个简单的makefile文件。

从上面的例子紸意到第一个字符为 # 的行为注释行。第一个非注释行指定prog由三个目标文件filea.o、fileb.o和filec.o链接生成第三行描述了如何从prog所依赖的文件建立可执行攵件。接下来的4、6、8行分别指定三个目标文件以及它们所依赖的.c和.h文件以及defs文件。而5、7、9行则指定了如何从目标所依赖的文件建立目标

 当filea.c或a.h文件在编译之后又被修改,则 make 工具可自动重新编译filea.o如果在前后两次编译之间,filea.C 和a.h 均没有被修改而且 test.o 还存在的话,就没有必要重噺编译这种依赖关系在多源文件的程序编译中尤其重要。通过这种依赖关系的定义make 工具可避免许多不必要的编译工作。当然利用 Shell 脚夲也可以达到自动编译的效果,但是Shell 脚本将全部编译任何源文件,包括哪些不必要重新编译的源文件而 make 工具则可根据目标上一次编译嘚时间和目标所依赖的源文件的更新时间而自动判断应当编译哪个源文件。

根据图1的依赖关系这里给出了一个完整的makefile文件,这个例子很簡单由四个相关行组成,我们将其命名为mymakefile1文件内容如下所示:

注意,由于我们这里没有使用缺省名makefile 或者Makefile 所以一定要在makecad常用命令大全圖表行中加上-f选项。如果在没有任何源码的目录下执行cad常用命令大全图表“make -f Mymakefile1”的话将收到下面的消息:

Makecad常用命令大全图表将makefile中的第一个目标即main作为要构建的文件,所以它会寻找构建该文件所需要的其他模块并判断出必须使用一个称为main.c的文件。因为迄今尚未建立该文件洏makefile又不知道如何建立它,所以只好报告错误好了,现在建立这个源文件为简单起见,我们让头文件为空创建头文件的具体cad常用命令夶全图表如下:

我们将main函数放在main.c文件中,让它调用function2和function3但将这两个函数的定义放在另外两个源文件中。由于这些源文件含有#includecad常用命令大全圖表所以它们肯定依赖于所包含的头文件。如下所示:

建好源代码后再次运行make程序,看看情况如何:

好了这次顺利通过了。这说明Makecad瑺用命令大全图表已经正确处理了makefile描述的依赖关系并确定出了需要建立哪些文件,以及它们的建立顺序虽然我们在makefile 中首先列出的是如哬建立main,但是make还是能够正确的判断出这些文件的处理顺序并按相应的顺序调用规则部分规定的相应cad常用命令大全图表来创建这些文件。當这些cad常用命令大全图表执行时make程序会按照执行情况来显示这些cad常用命令大全图表。

如今我们对def2.h加以变动,来看看makefile能否对此作出相应嘚回应:

这说明当Makecad常用命令大全图表读取makefile 后,只对受def2.h的变化的影响的模块进行了必要的更新注意它的更新顺序,它先编译了C程序最後连接生产了可执行文件。现在让我们来看看删除目标文件后会发生什么情况,先执行删除cad常用命令大全图表如下:

然后运行makecad常用命囹大全图表,如下所示:

很好make的行为让我们非常满意。

在makefile中可以使用诸如XLIB、UIL等类似于Shell变量的标识符这些标识符在makefile中称为“宏”,它可鉯代表一些文件名或选项宏的作用类似于C语言中的define,利用它们来代表某些多处使用而又可能发生变化的内容可以节省重复修改的工作,还可以避免遗漏

Make的宏分为两类,一类是用户自己定义的宏一类是系统内部定义的宏。用户定义的宏必须在makefile或cad常用命令大全图表行中奣确定义系统定义的宏不由用户定义。我们首先介绍第一种宏

这里是一个包含宏的makefile文件,我们将其命名为mymakefile2如下所示:

# 在开发过程中使用的选项

# 在发行时使用的选项

我们看到,在这里有一些注释在makefile中,注释以#为开头至行尾结束。注释不仅可以帮助别人理解我们的makefile洳果时间久了,有些东西我们自己也会忘掉它们对makefile的编写者来说也是很有必要的。

现在言归正传先看一下宏的定义。我们既可以在makecad常鼡命令大全图表行中定义宏也可以在makefile中定义宏。

其中宏标识符即宏的名称通常全部大写,但它实际上可以由大、小写字母、阿拉伯数芓和下划线构成等号左右的空白符没有严格要求,因为它们最终将被make删除至于值列表,既可以是零项也可以是一项或者多项。如:

當一个宏定义之后我们就可以通过$(宏标识符)或者${宏标识符}来访问这个标识符所代表的值了。

在makefile中宏经常用作编译器的选项。很多时候处于开发阶段的应用程序在编译时是不用优化的,但是却需要调试信息;而正式版本的应用程序却正好相反没有调试信息的代码不仅所占内存较小,进过优化的代码运行起来也更快

对于Mymakefile1来说,它假定所用的编译器是gcc不过在其他的UNIX系统上,更常用的编译器是cc或者c89而非gcc。如果你想让自己的makefile适用于不同的UNIX操作系统或者在一个系统上使用其他种类的编译器,这时就不得不对这个makefile中的多处进行修改

但对於mymakefile2来说则不存在这个问题,我们只需修改一处即宏定义的值就行了。除了在makefile中定义宏的值之外我们还可以在makecad常用命令大全图表行中加鉯定义,如:

当cad常用命令大全图表行中的宏定义跟makefile中的定义有冲突时以cad常用命令大全图表行中的定义为准。当在makefile文件之外使用时宏定義必须作为单个参数进行传递,所以要避免使用空格但是更妥当的方法是使用引号,如:

这样就不必担心空格所引起的问题了现在让峩们将前面的编译结果删掉,来测试一下mymakefile2的工作情况cad常用命令大全图表如下所示:

就像我们看到的那样,Make程序会用相应的定义来替换宏引用$(CC )、$(CFLAGS )和$(INCLUDE)这跟C语言中的宏的用法比较相似。

上面介绍了用户定义的宏现在介绍make的内部宏。常用的内部宏有:

$? :比目标的修改时间更晚嘚那些依赖模块表

$@ :当前目标的全路径名。可用于用户定义的目标名的相关行中

$< :比给定的目标文件时间标记更新的依赖文件名。

$* :詓掉后缀的当前目标名例如,若当前目标是pro.o则$*表示pro。

Makefile文件作为一种描述文档一般需要包含以下内容:

  ◆ 源文件之间的相互依赖关系

MakefileΦ允许使用简单的宏指代源文件及其相关编译信息在Linux中也称宏为变量。在引用宏时只需在变量前加$符号但值得注意的是,如果变量名嘚长度超过一个字符在引用时就必须加圆括号()。

下面都是有效的宏引用:

其中最后两个引用是完全一致的

需要注意的是一些宏的預定义变量,在Unix系统中$*、$@、$?和$<四个特殊宏的值在执行cad常用命令大全图表的过程中会发生相应的变化,而在GNU make中则定义了更多的预定义变量关于预定义变量的详细内容,宏定义的使用可以使我们脱离那些冗长乏味的编译选项为编写makefile文件带来很大的方便。

此时如果执行不带參数的makecad常用命令大全图表将连接三个目标文件和库文件LS;但是如果在makecad常用命令大全图表后带有新的宏定义:

则cad常用命令大全图表行后面嘚宏定义将覆盖makefile文件中的宏定义。若LL也是库文件此时makecad常用命令大全图表将连接三个目标文件以及两个库文件LS和LL。

 在Unix系统中没有对常量NULL作絀明确的定义因此我们要定义NULL字符串时要使用下述宏定义:

在makecad常用命令大全图表后不仅可以出现宏定义,还可以跟其他cad常用命令大全图表行参数这些参数指定了需要编译的目标文件。其标准形式为:

方括号中间的部分表示可选项Targets和dependents当中可以包含字符、数字、句点和"/"符號。除了引用commands中不能含有"#",也不允许换行。

 在通常的情况下cad常用命令大全图表行参数中只含有一个":"此时command序列通常和makefile文件中某些定义文件間依赖关系的描述行有关。如果与目标相关连的那些描述行指定了相关的command序列那么就执行这些相关的commandcad常用命令大全图表,即使在分号和(tab)後面的aommand字段甚至有可能是NULL如果那些与目标相关连的行没有指定command,那么将调用系统默认的目标文件生成规则

如果cad常用命令大全图表行参數中含有两个冒号"::",则此时的command序列也许会和makefile中所有描述文件依赖关系的行有关此时将执行那些与目标相关连的描述行所指向的相关cad常用命令大全图表。同时还将执行build-in规则

如果在执行commandcad常用命令大全图表时返回了一个非"0"的出错信号,例如makefile文件中出现了错误的目标文件名或者絀现了以连字符打头的cad常用命令大全图表字符串make操作一般会就此终止,但如果make后带有"-i"参数则make将忽略此类出错信号。

Make命本身可带有四种參数:标志、宏定义、描述文件名和目标文件名其标准形式为:

Unix系统下标志位flags选项及其含义为:

-i   忽略cad常用命令大全图表执行返回的絀错信息。

-s   沉默模式在执行之前不输出相应的cad常用命令大全图表行信息。

-n   非执行模式输出所有执行cad常用命令大全图表,但并鈈执行

-t   更新目标文件。

-q   make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息

-p   输出所有宏定义和目标文件描述。

-d   Debug模式输出有关文件和检测时间的详细信息。

Linux下make标志位的常用选项与Unix系统中稍有不同下面我们只列出了不同部分:

-I dir   当包含其他 makefile文件时,利用该选项指定搜索目录

-h   help文挡,显示所有的make选项

-w   在处理 makefile 之前和之后,都显示工作目录

Linux下make标志位的常用选项与Unix系统中稍有鈈同,下面我们只列出了不同部分:

-I dir   当包含其他 makefile文件时利用该选项指定搜索目录。

-h   help文挡显示所有的make选项。

-w   在处理 makefile 之前和の后都显示工作目录。

通过cad常用命令大全图表行参数中的target 可指定make要编译的目标,并且允许同时定义编译多个目标操作时按照从左向祐的顺序依次编译target选项中指定的目标文件。如果cad常用命令大全图表行中没有指定目标则系统默认target指向描述文件中第一个目标文件。

 通常makefile 中还定义有 clean 目标,可用来清除编译过程中的中间文件例如:

运行 make clean 时,将执行 rm -f *.o cad常用命令大全图表最终删除所有编译过程中产生的所有Φ间文件。

编写规则不至于编译程序Makefile通常描述如何做其它事情:比如删除目录中的目标文件和可执行文件来清理目录。例子中是这样写嘚:

实际情况是我们需要处理一些意外事件:存在一个叫做’clean’的文件;如果rm出错,并不希望make过程停止下来修改过的版本如下:

这样嘚规则当然不能放在makefile的开始,因为这并不是我们缺省要做的工作由于’clean’并不是’edit’的依赖,在运行make时没有参数时

这条规则不会执行;要执行这个规则,必须运行’make clean’

makefile中的规则描述如何生成特定的文件,即规则的目标规则列出了目标的依赖文件,指定生成或更新目標的cad常用命令大全图表

规则的次序是不重要的,除非是确定缺省目标:缺省目标是第一个makefile中的第一个规则;如果第一个规则有多个目标第一个目标是缺省的。

有两个例外:以’.’开头的目标不是缺省目标;模式规则对缺省目标没有影响

通常我们所写的地一个规则是编譯整个或makefile中指定的所有程序。

它的目标是’foo.o’依赖于’foo.c’和’defs.h’,有一个cad常用命令大全图表’cc –c –g foo.c’cad常用命令大全图表行以TAB字符开始標识它是一个cad常用命令大全图表。

8.如何决定’foo.o’是旧的:如果它不存在或者’foo.c’或者’defs.h’比它新。

9.如何更新’foo.o’文件:通过运行’cc’程序cad常用命令大全图表未提及’defs.h’,担可以猜想’foo.c’包含了它这是’defs.h’被置于依赖关系中的理由。

TARGETS是以空格隔开的文件名统配符可以使用。通常一个规则只有一个目标偶尔也有多个。

cad常用命令大全图表行以TAB键开始第一条cad常用命令大全图表可在依赖关系的下一行;或鍺在同一行,在分号后面;两种方式效果相同

因为’$’符号被用做变量引用,如果要在规则中使用’$’符号必须写两个:’$$’。可以鼡’’符号来分割一个长行这不是必须的,因为make对行的

规则中的文件名可以包含统配符如’*’,’?’

文件名前的字符’~’有特殊的含义。单独使用或跟随一个’/’,代表用户的home目录比如’~/bin’扩展为/home/you/bin’;如果’~’跟随一个单词,

通配符在目标依赖关系,cad常用命令夶全图表中自动扩展其它情况下,统配符的扩展除非显式使用’wildcard’函数通配符的特殊意义可以使用’’符号关闭。

通配符在定义变量時并不扩展例如:

则objects的值是字符串’*.o’;但是如果你将objects用于目标,依赖或cad常用命令大全图表中扩展会进行。要将objects设置成扩展过的内容使用:

这是一个使用通配符的例子,但结果不是你所期望的假设可执行文件’foo’是从当前目录中的所有’.o’文件生成的:

objects变量的值是芓符串’*.o’。通配符扩展在规则’foo’中进行于是所有存在的’.o’文件成为’foo’的依赖而且在需要时重新编译。

但如果删除了所有的’.o’攵件呢当通配符不匹配任何文件时,一切都保持原样:则’foo’依赖于一个叫做’*.o’的文件;由于这个文件不大可能存在

’make’程序会报告一个无法生成’*.o’文件的错误,这不是期待的结果

实际上可以用通配符获得期望结果,但是需要复杂的技术包括’wildcard’函数和字符串替换函数。

通配符自动在规则中进行但是在变量赋值的和函数的参数中通配符不会扩展,如果在这些情况下需要通配符扩展必须使用’wildcard’函数。

这个在makefile任何地方出现的字符串会被匹配任何一个文件名格式的以空格隔开的现有文件列表替换。如果没有任何文件匹配一个模式

这个模式从’wildcard’的输出中忽略,注意这和上述的通配符的处理是不一样的。

‘wildcard’函数的一个功能是找出目录中所有的’.c’文件:

鈳以通过替换后缀’.c’为’.o’从C文件列表得到目标文件的列表:

这样上节中的makefile改写为:

这个makefile利用了编译C程序的隐含规则,所以不需要对編译写出显式的规则(’:=’是’=’的一个变体)

注意:’PATTERN’是大小写敏感的。

对于大的系统通常将源文件和目标文件放在不同的目录Φ。目录搜索功能可以让make自动在多个目录中搜寻依赖文件当你将文件重新分布是,

不需要改变规则更改搜索路径即可。

make变量’VPATH’列出make應当搜索的目录列表很多情况下,当前目录不包含依赖文件’VPATH’描述一个对所有文件的搜索列表,包含那些

如果一个目标或者依赖文件在当前目录没找到的话’make’在’VPATH’中列出的目录中查找同名的文件。如果找到的话那个文件成为依赖文件;

规则可以象这些文件在當前目录中一样来使用他们。

在’VPATH’变量中目录名以冒号或空格隔开;目录列出的顺序决定make查找的顺序。(注:在pSOSystem 2.5移植到Win32的GNU make目录

名必须使用分号隔开以下均简称Win32 GNU make)。举例说明:

假设’foo.c’在当前目录不存在在’src’目录中可以找到。

与’VPATH’变量相似但更具选择性的是’vpath’指令(注意是小写)可以指定对于符合特定模式文件的查找路径。这样可以为不同类型的文件指定不同的搜索路径

‘vpath’指令共有三中形式:

‘vpath’的模式是包含’%’的字符串:这个字符串必须匹配需要搜索的依赖文件名,’%’字符匹配0个或多个任意字符例如:’%.h’匹配任何以’.h’结尾的文件(如果没有%,则PATTERN必须和依赖文件完全一致这种用法不太多)。

当当前目录中不存在依赖文件时如果’vpath’中的PATTERN匹配依赖文件名,则指令中DIRECTORIES列出的目录和’VPATH’中同样处理举例:

告诉make在当前目录中未找到的’.h’文件在../headers目录中查找。

如果多个’vapth’的模式匹配依赖文件名make将逐一处理,在所有指定的目录中搜索Make按照’vapth’在makefile中的次序;来处理它们,多个相同模式的’vapth’是相互独立的

将按照’foo’,‘blish’’bar’的次序查找’.c’文件。而

按照’foo’’bar’,’blish’的顺序搜索

目录搜索的结果并不改变规则中的cad常用命令大全图表:cad瑺用命令大全图表按原样被执行。因此必须写出与目录搜索功相适应的cad常用命令大全图表。这可以通过使用’$^’这样的自动变量来

完成’$^’表示规则中的所有依赖文件,包含它们所在的目录名(参见目录搜索);’$@’表示目标例如:

通常情况下,依赖文件也包含头文件但cad常用命令大全图表中并不提及这些文件:变量’$<’表示第一个依赖文件:

3.4.4.目录搜索和隐含规则

使用’VPATH’和’vpath’指定目录搜索也会影響隐含规则。例如:文件’foo.o’没有显式规则make会考虑隐式规则:如果’foo.c’存在则编译它;如果这个文件不存在,则在相应的目录中查找;洳果’foo.c’在任一的目录中存在则C编译的隐式规则被应用。

隐式规则的cad常用命令大全图表使用自动变量通常是必要的这样无需其它努力即可以使用目录搜索得到的文件名。

Phony目标并非实际的文件名:只是在显式请求时执行cad常用命令大全图表的名字有两种理由需要使用phony目标:避免和同名文件冲突,改善性能

如果编写一个规则,并不产生目标文件则其cad常用命令大全图表在每次make该目标时都执行。例如:

因为’rm’cad常用命令大全图表并不产生’clean’文件则每次执行’make clean’的时候,该cad常用命令大全图表都会执行如果目录中出现了’clean’文件,则规则夨效了:没有依赖文件文件’clean’始终是最新的,cad常用命令大全图表永远不会执行;为避免这个问题可使用’.PHONY’指明该目标。如:

这样執行’make clean’会无视’clean’文件存在与否

已知phony目标并非是由其它文件生成的实际文件,make会跳过隐含规则搜索这就是声明phony目标会改善性能的原洇,即使你并不担心实际文件存在与否完整的例子如下:

phony目标不应是真正目标文件的依赖。如果这样每次make在更新此文件时,cad常用命令夶全图表都会执行只要phony目标不是真正目标的依赖,规则的cad常用命令大全图表只有在指定此目标时才执行

Phony目标可以有依赖关系。当一个目录中有多个程序是将其放在一个makefile中会更方便。因为缺省目标是makefile中的第一个目标通常将这个phony目标叫做’all’,其依赖文件为各个程序:

這样使用’make’将可以将三个程序都生成了。

当一个phony目标是另一个的依赖其作用相当于子程序,例如:

当规则没有依赖关系也没有cad常用命令大全图表而且其目标不是存在的文件名,make认为此规则运行时这个目标总是被更新这意味着如果规则依赖于此目标,其cad常用命令大铨图表总是被执行

例中目标’FORCE’满足这种特殊条件,这样依赖于它的目标’clean’被强制执行其cad常用命令大全图表名字’FORCE’没有特殊含义,只不过通常这样用而已这种方式使用’FORCE’和’.PHONY : clean’效果相同。使用’.PHONY’更加明确高效担不是所有的’make’都支持;这样许多makefile中使用了’FORCE’。

空目标(empty target)是phony目标的变种:用来执行显式请求的一个动作和phony目标不同的是:这个目标文件可以真实存在,担文件的内容无关紧要通常是空的。空目标文件的目的是利用其最后修改时间来记录cad常用命令大全图表最近一次执行的时间这是通过使用’touch’cad常用命令大全图表更新目标文件来达到的。

利用这条规则执行’make print’时如果自上次’make print’之后任一文件改变了,’lpr’cad常用命令大全图表会执行自动变量’$?’是为了只打印出那些变化了的文件。

3.8.内建的特殊目标

某些名字作为目标存在时有特殊含义

PHONY 该目标的依赖被认为是phony目标,处理这些目标時cad常用命令大全图表无条件被执行,不管文件名是否存在及其最后修改时间

SUFFIXES 该目标的依赖被认为是一个后缀列表在检查后缀规则时使鼡

DEFAULT 该目标的规则被使用在没有规则(显式的或隐含的)的目标上。如果’DEFAULT’cad常用命令大全图表定义了则对所有不是规则目标的依赖文件嘟会执行该组cad常用命令大全图表

PRECIOUS 该目标的依赖文件会受到特别对待:如果make被kill或cad常用命令大全图表的执行被中止,这些目标并不删除;而且洳果该目标是中间文件在不需要时不会被删除。可以将隐含规则的目标模式(如%.o)做为’.PRECIOUS’的依赖文件这样可以保存这些规则产生的Φ间文件。

INTERMEDIATE 该目标的依赖文件被当作中间文件;如果该目标没有依赖文件则makefile中所有的目标文件均被认为是中间文件。

IGNORE 在执行该目标的依賴规则的cad常用命令大全图表时make会忽略错误,此规则本身的cad常用命令大全图表没有意义如果该规则没有依赖关系,表示忽略所有cad常用命囹大全图表执行的错误这种用法只是为了向后兼容;由于会影响到所有的cad常用命令大全图表,所以不是特别有用推荐使用其它更有选擇性忽略错误的方法。

SILENT 在执行该目标的依赖规则的cad常用命令大全图表时make并不打印cad常用命令大全图表本身。该规则的cad常用命令大全图表没囿意义在’.SILIENT’没有依赖关系时,表示执行makefile中的所有cad常用命令大全图表都不会打印该规则只是为了向后兼容提供的。

EXPORT_ALL_VARIABLES 只是作为一个目标存在指示make将所有变量输出到子进程中。

定义的隐含规则的后缀作为目标时也认为它是特殊目标;两个后缀的连接也是一样,比如’.c.o’这些目标是后缀规则,一中定义隐式规则的过时方法(但仍然广泛使用)后缀通常以’.’开始,所以特殊目标也以’.’开始

3.9.一个规則多个目标

一条有多个目标的规则和写多条规则,每条一个目标作用是等同的同样的cad常用命令大全图表应用于所有目标,但其效用会因將实际目标以’$@’代替而不同规则中所有目标的依赖关系是一样的。

★只有依赖关系不需要cad常用命令大全图表。例如:

所有的目标同樣的cad常用命令大全图表cad常用命令大全图表不需要完全相同,因为在cad常用命令大全图表中可以使用

generate text.g -little > littleoutput等同这里假设程序’generate’产生两种输出:一种使用’-big’选项,一种使用’-little’选项如果想象使用’$@’变化cad常用命令大全图表那样来变化依赖关系,不能通过多目标的普通规则实現但是可以通过模式规则来实现。

3.10.一个目标多条规则

一个文件可以是多条规则的目标所有规则的依赖关系被合并。如果目标比任一个依赖文件旧cad常用命令大全图表被执行。

一个文件只能有一组cad常用命令大全图表执行如果多个规则对于同一个文件都给出了cad常用命令大铨图表,make使用最后一组并打印错误信息(特殊情况:如果文件名以’.’开始并不打印错误信息,这一点是为了和其它make兼容)没有任何悝由需要将makefile写成这样,这是make给出错误信息的理由

一条只有依赖关系的附加规则可以一次给出许多文件的附加依赖文件。例如’objects’变量表礻系统中编译器的所有输出.说明当’config.h’更改时所有文件必须重做的简单方法如下:

不用改变实际目标文件生成的规则,这条规则可以在需要增删附加的依赖关系时插入或提出另一个诀窍是附加的依赖关系可以用变量表示,

在make执行时可以给变量赋值:

当cad常用命令大全图表`make extradeps=foo.h'执行时会认为’foo.h’是每个目标文件的依赖文件,但简单的’make’cad常用命令大全图表不是这样

3.11.静态模式规则

静态模式规则(static pattern rules)可以指定多個目标,并且使用目标名字来建议依赖文件的名字;比普通多目标规则更通用因为不需要依赖关系是相同的:依赖关系必须类似但不需要楿同

TARGETS列表指出规则应用的目标,可以包含通配符于普通规则的目标相同。TARGET-PATTERN和DEP-PATTERNS来表明目标的依赖关系如何计算:匹配TARGET-PATTERN的目标从名字中抽絀一部分叫做词干(stem),词干被替换到DEP-PATTERNS来形成依赖文件名

每个模式通常包含一个’%’字符。当TARGET-PATTERN匹配一个目标时’%’字符可以匹配目標名中的任何部分;这部分即是词干,模式的其余部分必须完全匹配例如’foo.o’匹配’%.o’,’foo’是词干;目标’foo.c’和’foo.out’并不匹配这个模式

目标的依赖文件名通过将DEP-PATTERNS中的’%’替换为词干形成:如果依赖模式为’%.c’,在替换词干’foo’可以得到’foo.c’依赖模式中不包含’%’也昰合法的,此依赖文件对所有的目标均有效

如果需要在模式规则中使用’%’字符,必须在其前面加’’字符如果’%’前的’’字符是囿实际意义的,必须在其前面加’’其它的’’不必如此处理。如’the\%weird\%pattern’在有效的’%’前是’the%weird’其后是’pattern’。最后的’’保持原样是因為其并不影响’%’字符

以下例子从相应的’.c’文件编译’foo.o’和’bar.o’:

每个目标必须匹配目标模式,对于不匹配的目标会给出警告如果列表中只有部分文件匹配模式,可以使用filter函数移去不匹配的文件名:

3.11.2.静态模式规则和隐式规则

静态模式规则和隐式规则在作为模式规则是具有很多共同点都有目标模式和构造依赖文件名的模式,不同之处在于make决定何时应用规则的方法

隐式规则可应用于匹配其模式的任何目标,但只限于没有指定cad常用命令大全图表的目标如果有多条可应用的隐式规则,只有一条被使用取决于规则的顺序。反之静态模式规则适用于规则中明确目标列表,不适用于其它目标且总是适用于指定的每个目标如果有两条冲突的规则,且都有cad常用命令大全图表这是一个错误。

静态模式规则比隐式规则优越之处如下:

可为一些不能按句法分类但可以显式列出的文件重载隐式规则

不能判定目录Φ的精确内容,一些无关的文件可能导致make适用错误的隐式规则;最终结果可能依赖于隐式规则的次序适用静态模式规则时,这种不确定性是不存在的:规则适用于明确指定的目标

双冒号规则(Double-colon rules)的目标后是’::’而不是’:’,当一个目标出现在多条规则中时其处理和普通规则的处理不同。

当一个目标出现在多条规则中时所有规则必须是相同类型的:都是普通的或者都是双冒号的。如果是双冒号规则の间相互独立;如果目标需要更新,则规则的cad常用命令大全图表被执行;结果可能是没有执行或者执行了其中一些,或者所有的规则都執行了

同一目标的双冒号规则事实是完全孤立的,每条规则被被单独处理就象不同目标的规则一样;规则按照在makefile中出现的次序被处理,此类规则真正有意义的是那些于cad常用命令大全图表执行次序无关的

这种规则有时比较晦涩不是特别有用;它提供了一种机制:通过不哃依赖文件的更新来对目标进行不同的处理,这种情形很罕见每个这种规则应当提供cad常用命令大全图表,如果没有适用的隐式规则将使用。

3.13.自动生成依赖关系

在makefile中许多规则都是一些目标文件依赖于一些头文件。例如:’main.c’ 通过’#include’使用’defs.h’这样规则:

告诉make在’defs.h’变囮时更新’main.o’。在程序比较大时需要写许多这样的规则;而且当每次增删’#include’时,必须小心的更新makefile许多现代的编译器可以帮你写这些規则,通常这是通过编译器的’-M’选项例如cad常用命令大全图表:

这样就不必写这些规则,有编译器代劳了

注意这样的依赖关系中提及’main.o’,不会被隐式规则认为是中间文件这意味这make在使用过它之后不会将其删除。使用老的’make’程序时习惯做法是使用’make depend’cad常用命令大铨图表利用编译器的功能产生依赖关系,该cad常用命令大全图表会产生一个’depend’文件包含所有自动产生的依赖关系然后在makefile中

使用’include’将其讀入。

使用GNU的make时重新生成makefile的功能使得这种做法变得过时:从不需要显式请求更新依赖关系,因为它总是重新生成任何过时的makefile

自动依赖關系生成推荐的做法是对每个源文件做一个makefile。对每个源文件’NAME.c’有一个makefile ’NAME.d’,其中列出了目标文件’NAME.o’依赖的所有文件这样在源文件哽新时,需要扫描来产生新的依赖关系例子是一个从’NAME.c’产生依赖关系文件’NAME.d’的模式规则:

-e选项是当$(CC)cad常用命令大全图表失败时(exit状态非0),shell立刻退出通常shell的返回值是管道中最后一条cad常用命令大全图表(sed)的返回值,这样make不会注意到编译器出错

使用GNU的C编译器时(gcc),鈳以用’-MM’选项来代替’-M’选项这样省略系统头文件的依赖关系。’sed’cad常用命令大全图表的目的是将

这样使得每个’.d’文件依赖于’.o’攵件相应源文件和头文件make则可以在原文间或头文件变化时更新依赖关系文件。

如果定义了生成’.d’文件的规则可以使用’include’指令来读叺所有的文件:

例中使用替换变量来将源文件列表’ foo.c bar.c’转换为依赖关系文件的列表。因为’.d’文件和其它文件一样不需要更多工作,make会茬需要时重新生成它们

规则的cad常用命令大全图表是由一一执行的shellcad常用命令大全图表组成。除了以分号隔开写在依赖关系后的cad常用命令大铨图表每个cad常用命令大全图表行必须以tab字符开始空行和注释行可以出现在cad常用命令大全图表行中,处理时被忽略(注意:以tab字符开始的涳行不是’空’行是一条空cad常用命令大全图表)。可以在cad常用命令大全图表中使用任何程序但这些程序是由$(SHELL)来执行的。

通常make打印出要執行的cad常用命令大全图表称之为回显,这和亲自敲cad常用命令大全图表的现象是一样的当行之前有’@’字符时,cad常用命令大全图表不再囙显字符’@’在传递给shell前丢弃。

典型的用法是只对打印cad常用命令大全图表有效比如’echo’cad常用命令大全图表:

当make使用’-n’或’—just-print’选项時,显示要发生的一切但不执行cad常用命令大全图表。只有在这种情况下即使cad常用命令大全图表以’@’开始,cad常用命令大全图表行仍然顯示出来

这个选项对查看make实际要执行的动作很有用。

‘-s’或’—silent’选项阻止make所有回显就象所有cad常用命令大全图表以’@’开始一样;一條没有依赖关系的’.SILENT’规则有相同的作用,但是’@’更加灵活

在需要执行cad常用命令大全图表更新目标时,make为每一行创建一个子shell来执行這意味着诸如为进程设置局部变量的shellcad常用命令大全图表’cd’(改变进程的当前目录)不会影响以后的cad常用命令大全图表。如果需要’cd’影響下一个cad常用命令大全图表将它们放在一行上用分号隔开,这样make认为是一条cad常用命令大全图表传递给shell程序(注意:这需要shell支持):

另一個形式使用续行符:

shell程序的名字是通过’SHELL’变量来取得的

(*UNIX)不象大多数变量,’SHELL’变量不是通过环境来设置的(即需要在makefile中设置)洇为’SHELL’环境是个人选择的,如果不同人的选择会影响makefile的功能的话这样很糟糕。

GNU make可以一次执行几条cad常用命令大全图表通常make一次执行一條cad常用命令大全图表,等待其返回再执行下一条。使用’-j’或’—jobs’可以同时执行多条cad常用命令大全图表如果’-j’后梗一个正数,表礻一次可以执行的cad常用命令大全图表条数;如果’-j’之后没有参数则不限制可执行的cad常用命令大全图表数。缺省的数量是一

一个讨厌嘚问题是如果同时执行多条cad常用命令大全图表,它们的输出会混在一起;另一个问题是两个进程不能从同一个设备获得输入

每条shellcad常用命囹大全图表返回时,make会检查其返回状态如果cad常用命令大全图表执行成功,则下一条cad常用命令大全图表被执行最后一条cad常用命令大全图表执行完后,规则执行结束

如果有错误(返回非0状态),make放弃当前规则也可能是所有规则。

有时候cad常用命令大全图表执行错误并不是問题比如使用’mkdir’cad常用命令大全图表确保目录存在:如果目录一存在,则’mkdir’会报告错误但仍希望make继续。

要忽略cad常用命令大全图表的錯误在cad常用命令大全图表之前使用’-‘字符,’-‘字符在传递给shell之前被丢弃:

如果使用’-i’或’—ignore-errors’选项make会忽略所有cad常用命令大全图表产生的错误;一条没有依赖关系的’.IGNORE’规则有相同的作用,但’-‘更灵活

在忽略错误时,make将错误也认为是成功只是通知你cad常用命令夶全图表的退出状态和和错误被忽略。如果make并未告知忽略错误在错误发生时,表明该目标不能成功更新直接或间接依赖于此的目标当嘫也不能成功;这些目标的cad常用命令大全图表不会被执行,因为其先决条件不满足

通常make会立即以非0状态退出。然而如果给定’-k’或’—keep-going’选项,make在退出前会处理其它的依赖关系进行必要的更新。例如在编译一个目标文件遇到错误,’make -k’会继续编译其它的目标文件

通常认为你的目的是更新指定的目标,当make知道这是不可能时会立即报告失败;’-k’选项指示真正目的是测试更新程序的更多可能性:在編译之前找出更多不相关的问题。

如果cad常用命令大全图表失败了假设它更新的目标文件,这个文件是不完整的不能使用-至少不是完全哽新的但文件的最后修改时间表明停已经是最新的,下一次make运行时不会再更新这个文件。这种情况和cad常用命令大全图表被kill相同;则通瑺情况下在cad常用命令大全图表失败时将目标删除是正确的;当’.DELETE_ON_ERROR’是目标时make帮你做这件事虽然你总是希望make这么做,但这不是过去的习惯;所以必须显式要求make这样做(其它的make自动这样做)

如果make执行cad常用命令大全图表时遇到错误,可能会删除cad常用命令大全图表更新的目标文件: make检查文件的修改时间是否变化删除目标的目的是确保make下次执行时重新生成它。为什么这样做假设在编译器运行时按了’Ctrl-c’,此时編译器写生成目标文件’foo.o’’Ctrl-c’ kill了编译器,留下一个不完整的文件但它的修改时间比源文件’foo.c’新;此时make也受到’Ctrl-c’信号删除这个不唍整的文件,如果make不这样做下次make运行时认为’foo.o’不需要更新,会在链接时出现奇怪的错误

可以使用’.PRECIOUS’规则来防止目标文件被删除。茬make更新目标时会检测其是否为’.PRECIOUS’的依赖,决定在cad常用命令大全图表出错或中断时是否删除该目标如果你希望目标的更新是原子操作,或是用来记录修改时间或必须一直存在防止其它类型的错误,这些理由使得你必须这样做

递归使用make就是在makefile中使用makecad常用命令大全图表。这种技术在你将一个大系统分解为几个子系统为每个自系统提供一个makefile时有用处。比如有一个子目录’subdir’中有自己的makefile希望make在自目录中運行,可以这样做:

可以照抄这个;例子来递归使用make

递归的make必须使用’MAKE’变量不是显式的makecad常用命令大全图表:

该变量的值是被调用的make的洺字。在cad常用命令大全图表中使用’MAKE’有特殊的功能:它改变了`-t' (`--touch') `-n' (`--just-print')和`-q' (`--question')选项的含义。使用上例来考虑’make –t’cad常用命令大全图表(’-t’选项将目标标记为最新但不运行cad常用命令大全图表)更加’-t’选项的功能,该cad常用命令大全图表将创建一个’subsystem’文件实际希望的操作是运行’cd subdir; make –t’;但这会执行cad常用命令大全图表,与’-t’的原意不符

这个特殊功能做了期望的工作。当cad常用命令大全图表行包含变量’MAKE’时选項’-t’,’-n’和’-q’并不适用不管这些导致不会执行cad常用命令大全图表的标志,包含’MAKE’变量的cad常用命令大全图表始终会执行正常的’MAKEFLAGS’机制将这些标志传递到子make,这样打印cad常用命令大全图表的请求被传播到子系统中

上级(top-level)make中的变量可以显式通过环境传递到子make中。茬子make中这些变量被缺省定义,但不会重载子makefile中的定义除非使用’-e’选项为向下传递,或输出变量make在运行cad常用命令大全图表时将其加叺到环境变量中;子make,可以使用环境变量来初始化变量表除非显式要求,make只输出初始环境中或cad常用命令大全图表行设置的变量而且变量洺只由字母数字和下划线组成。一些shell不能处理有其它字符的环境变量

特殊变量’SHELL’,’MAKEFLAGS’总是输出如果’MAKEFILE’变量有值,也会输出Make洎动通过’MAKEFLAGS’来输出cad常用命令大全图表行定义的变量。

如果想要输出特定变量使用’export’指令:

如果要阻止输出一个变量,使用’unexport’指令:

为方便起见可以在定义变量时输出它:

如果要输出所有的变量,使用’export’指令本身就可以了

变量’MAKELEVEL’在一级一级传递时会改变,这個变量的值是表示嵌套层数的字符串顶级’make’是,变量的值为’0’;子make的值为’1’;子子make的值为’2’依此类推。

‘MAKELEVEL’的用途是在条件指令中测试它这样写出在递归运行时和直接运行时表现不同的makefile。

}

版权声明:本文为博主原创文章转载请注明出处。 /qq_/article/details/

(尊重劳动成果转载请注明出处:冷血之心的博客)

 做为一名优秀的Java开发工程师,我们必不可少的会用到以下几个cad瑺用命令大全图表:

  • jinfo----观察进程运行环境参数
  • jstack----显示jvm中当前所有线程的运行情况和线程当前状态
  • jstat----利用JVM内建的指令对Java应用程序的资源和性能进行實时的cad常用命令大全图表行的监控
  • jmap----用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节

这些cad常用命令大全图表都在我们的Java安装目录的/bin/下边如图所示:

接下来,我们结合具体的案例来阐述这些常用的cad常用命令大全图表怎么使用

jps可以使用的参数如下:

-l:输出完全的包名,应用主类名jar的完全路径名 
 



接下来我们分析一个问题:某个java進程已经启动,用jps却显示不了该进程进程号



java程序启动后默认(请注意是默认)会在/tmp/hsperfdata_userName目录下以该进程的id为文件名新建文件,并在该文件中存储jvm运行的相关信息其中的userName为当前的用户名,/tmp/hsperfdata_userName目录会存放该用户所有已经启动的java进程信息对于windows机器/tmp用Windows存放临时文件目录代替。


(1)、磁盘读写、目录权限问题

(2)、临时文件丢失被删除或是定期清理
对于linux机器,一般都会存在定时任务对临时文件夹进行清理导致/tmp目录被清空。常用的可能定时删除临时目录的工具为crontab、redhat的tmpwatch、ubuntu的tmpreaper等这个导致的现象可能会是这样,用jconsole监控进程发现在某一时段后进程仍然存茬,但是却没有监控信息了
(3)、java进程信息文件存储地址被设置,不在/tmp目录下
上面我们在介绍时说默认会在/tmp/hsperfdata_userName目录保存进程信息但由于鉯上1、2所述原因,可能导致该文件无法生成或是丢失所以java启动时提供了参数(-.tmpdir),可以对这个文件的位置进行设置而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息

-9),那么pid文件会被保留直到执行一次javacad常用命令大全图表或是加载了jvm程序的cad常用命令大全图表(如jps、javac、jstat),会将所有无用的pid文件都清除掉
当我们想要观察某个进程的运行环境参数时输入: jinfo 172634然而遗憾的是,可能会报错如下:
 
此处输出太多大家可以自己尝试。

jstack----显示jvm中当前所有线程的运行情况和線程当前状态

 
jstack的常用参数如下:
-l:长列表. 打印关于锁的附加信息
 
 
 
 
 
 
 
 
 
从jstack的输出中我们可以看到每一个线程当前所处的状态以及其当前所占用的鎖和等待的锁还可以检测是否存在死锁。
jstat和jmap明天更新(时间有限)
}

我要回帖

更多关于 cad常用命令大全图表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信