windows下的makefile教程

windows下的makefile教程
windows下的makefile教程

windows下的makefile教程

https://www.360docs.net/doc/0016098033.html,/mirror_hc/archive/2008/03/26/2221117.aspx

joeliu 制作4/19/2011 22:10:29

1. 先说几句废话

以前看书时经常遇到makefile,nmake这几个名词,然后随之而来的就是一大段莫名其妙的代码,把我看得云里雾里的。在图书馆和google上搜了半天,也只能找到一些零零星星的资料,把我一直郁闷得不行。最近因缘巧合,被我搞到了一份传说中的MASM6手册,终于揭开了NMAKE的庐山真面目。想到那些可能正遭受着同样苦难的同志以及那些看到E文就头晕的兄弟,所以就写了这篇文章。假如大家觉得有帮助的话,记得回复一下,当作鼓励!如果觉得很白痴,也请扔几个鸡蛋.本文是总结加翻译,对于一些关键词以及一些不是很确定的句子,保留了英文原版,然后再在括号里给出自己的理解以作参考。由于水平有限,加上使用NMAKE的经验尚浅,有不对的地方大家记得要指正唷。MASM6手册在AOGO(好像是)可以download,在我的BLOG上有到那的链接。

2. 关于NMAKE

Microsoft Program Maintenance Utility,外号NMAKE,顾名思义,是用来管理程序的工具。其实说白了,就是一个解释程序。它处理一种叫做makefile的文件(以mak为后缀),解释里面的语句并执行相应的指令。我们编写makefile文件,按照规定的语法描述文件之间的依赖关系,以及与该依赖关系相关联的一系列操作。然后在调用NMAKE时,它会检查所有相关的文件,如果目标文件(target file,下文简称target,即依赖于其它文件的文件)的time stamp(就是文件最后一次被修改的时间,一个32位数,表示距离1980年以来经过的时间,以2秒为单位)小于依赖文件(dependent file,下文简称dependent,即被依赖的文件)的time stamp,NMAKE就执行与该依赖关系相关联的操作。请看下面这个例子:foo.exe : first.obj second.obj

link first.obj,second.obj

第一行定义了依赖关系,称为dependency line;第二行给出了与该依赖关系相关联的操作,称为command line。因为foo.exe由first.obj和second.obj连接而成,所以说foo.exe依赖于first.ogj和second.obj,即foo.exe为target,first.obj和second.obj为dependent。如果first.obj和second.obj中的任何一个被修改了(其time stamp更大),则调用link.exe,重新连接生成foo.exe。这就是NMAKE的执行逻辑。

综上,NMAKE的核心就是这3个家伙——依赖关系,操作和判定逻辑(target.timestamp < dependent.timestamp,如果为true,就执行相应操作)。

3. MAKEFILE的语法

现在详细讨论一下makefile的语法。makefile就像一个玩具型的程序语言,麻雀虽小,但五脏具全。makefile的组成部分包括:描述语句(description block),推导规则(inference rules),宏和指令(directive)。

描述语句就是dependent lines和command lines的组合;推导规则就是预先定义好的或用户自己定义的依赖关系和关联命令;宏就不用说了吧;指令就是内定的一些可以被NMAKE识别的控制命令,提供了很多有用的功能。

3.1 特殊符号

另外,makefile中使用以下几个具有特殊意义的符号:

^ # \ ( ) { } ! @ - : ; $

^(caret):用于关闭某些字符所具有的特殊意义,使其只表示字面上的意义。例如:^#abc表示#abc这个字符串,而#abc则用于在makefile中加入注释,#在这里为注释标志,就像C++中的//。另外,在一行的末尾加上^,可以使行尾的回车换行符成为字串的一部分。

#(number sign):为注释标志,NMAKE会忽略所有从#开始到下一个换行符之间的所有文本。这里要注意的是:在command lines中不能存在注释。因为对于command lines,NMAKE是将其整行传递给OS的。通常对于command lines的注释都是放在行与行之间。

\(backslash):用于将两行合并为一行。将其放在行尾,NMAKE就会将行尾的回车换行符解释为空格(space)。

%(percent symbol):表示其后的字符串为一文件名。用法较复杂,在讲dependent lines 的时候再详细讨论。

!(exclamation symbol):命令修饰符,在下面会有详细的讨论。

@(at sign):命令修饰符,在下面会有详细的讨论。

:(colon):用于dependent lines和inference rules中,用于分隔target和dependent。

;(semicolon):如果对于一个dependent line只有一条命令,则可以将该命令放在dependent line的后面,二者之间用―;‖分隔。

$(dolor sign):用于调用宏,在下面讲宏的时候再详细讨论。

在makefile中还可以使用DOS通配符(wildcard)来描述文件:* 和?。作用相信大家都很熟悉了,在此就不再浪费口水了。

如果要将中间有空格或制表符的字符串作为整体对待,则应该用双引号”将之括起来,例如,在指定一个中间有空格的长文件名的时候:

―My Document‖

或在定义一个宏的时候:

MYMACRO=‖copy a:\foo.exe c:\‖

3.2 描述语句块(Description Blocks)

描述语句块为makefile主体的基本组成单元,其典型结构如下:

target : dependents

commands block

Dependent Line

每一个描述语句块中只有一个dependent line,其定义了一个依赖关系。该行的开头不能有任何空白(空格或制表符)。冒号两边的target和dependent都可以有多个,之间以空格分隔。NMAKE在分析makefile时首先会从头到尾扫描每一个dependent line,然后根据依赖关系建立起一棵依赖关系树(dependent tree)。例如对于依赖关系:

foo.exe : first.obj second.obj

first.obj : first.cpp

second.obj : second.cpp

则在其依赖关系树中,foo.exe为first.obj和second.obj的父亲,而first.obj则是first.cpp 的父亲,second.obj是second.cpp的父亲。如果second.cpp被更新了,则second.obj会被重新构造,从而导致foo.exe被重新构造。NMAKE就是这样由下而上地对整棵树中的结点进行评估的。

虽然makefile中可以有很多的dependent lines,但NMAKE只会构造出现在它的命令

行中的targets,或者,如果命令行中没有给出targets,就构造第一个dependent line中的第一个target。其他所有无关的targets都不会被构造。例如:

foo1.exe foo2.exe : first.obj

first.obj : first.cpp

second.obj : second.cpp

假设上面的第一行语句为makefile中出现的第一个dependent line,且命令行中没有给出target。当first.cpp被更新后,first.obj和foo1.exe都会被重新构造,而foo2.exe和second.obj 则不会。

当在一个dependent line中出现多个target时,例如:

boy.exe girl.exe : first.obj

echo Hello

该语句相当于:

boy.exe : first.obj

echo Hello

girl.exe : first.obj

echo Hello

注:echo是一条控制台命令,用于在STDOUT上显示一行信息)

同一个target也可以出现在多个dependent lines中。在这种情况下,如果只有一个dependent line后跟有command line,则它们会被合并为一个描述语句块,例如:foo.exe : first.obj

echo Building foo.exe…

foo.exe : second.obj

NMAKE会将其处理为:

foo.exe : first.obj second.obj

echo Building foo.exe…

如果每一个dependent line后都有command line,则它们会被作为两个描述语句块处理。

如果在dependent line中使用双冒号(::)来分隔target和dependent,并且同一个target 出现在多个描述语句块中,此时,NMAKE将会匹配最合适的语句块,以构造该target。

例如:

target.lib :: one.asm two.asm three.asm

ML one.asm two.asm three.asm

LIB target -+one.obj -+two.obj -+three.obj;

target.lib :: four.c five.c

CL /c four.c five.c

LIB target -+four.obj -+five.obj;

Target.lib同时出现在两个描述语句块中,此时,NMAKE在处理该makefile时,将会选择其中一个描述语句块中的命令来执行。如果任何asm文件被更新了,NMAKE就调用ML重新编译之,然后再调用LIB(但CL以及之后的命令都不会被调用);类似地,如果任何C文件被更新了,NMAKE就会调用CL。

在通常情况下,target和dependent都是文件名。NMAKE会首先在当前目录下搜索dependent,如果没有找到,就到用户指定的目录下搜索。指定搜索路径的语法如下:{directory1;directory2;…}dependent

搜索路径放在{}之中,如果有多个,就用―;‖分开。注意,在各个语法成分之间是不能

有空白的。

Target和dependent也可以不是一个文件,而是一个标号(label)。这时,就称之为pseudotarget(伪文件)。Pseudotarget的名字不能与当前目录下的任何文件名相同。一个pseudotarget如果要作为dependent,那么它必须要作为target出现在某个dependent line中。当使用pseudotarget作为target时,与之关联的commands block一定会被执行,同时NMAKE 会赋予它一个假想的time stamp。该time stamp等于它的dependents中最大的time stamp,或者,如果它没有dependent,就等于当前时间。该假想的time stamp在pseudotarget作为dependent时会被用来进行有效性评估。这个特性最大的好处就是,你可以让NMAKE构造多个target,而不用将每个target都在NMAKE的命令行中列出来,例如:all : setenv project1.exe project2.exe

project1.exe : project1.obj

LINK project1;

project2.exe : project2.obj

LINK project2;

setenv :

set LIB=\project\lib

上例中有两个pseudotarget,一个是all,另一个是setenv。首先是setenv被评估,其作用是设置环境变量LIB,然后project1.exe和project2.exe依次被更新.

Commands Block

第二行开始到下一个dependent line之间为commands block,其给出了当dependents中的任何一个的time stamp大于target时,需要执行的指令序列(commadns block也可以为空,此时,NMAKE什么也不干)。command line必须以空白开头(刚好与dependent line相反,NMAKE就是通过该特征来分辨二者的),并且在dependent line和commands block中的第一条语句之间不能有空白行(就是除了一个换行符,什么也没有的行。所以只有一个空格或制表符的行是合法的,此时NMAKE将其解释为一个null command),但在command lines之间可以有空白行。Commands block中的每一条命令可以是在控制台中合法的任何命令。事实上大可将commands block当成一个由控制台命令序列组成的批处理文件。

此外,对commands block中的命令,还可以在其前面添加一个或多个所谓的命令修饰符(command modifier),以实现对命令的一些额外的控制。命令修饰符有以下3种:

1) @command

消除该命令的所有到STDOUT的输出。

2) –[number]command

关掉对该命令返回值的检测。在默认的情况下,如果一条命令返回非0值,则NMAKE 将会停止执行。但如果在命令前加上一―-‖,则NMAKE将会忽略该命令的返回值。如果―-‖紧接着一个整数,则NMAKE会忽略掉任何大于该整数的返回值。

3) !command

如果该命令的执行对象为$**或$?(这两个都是预定义的宏,前者表示相应的dependent line中所有的dependent,后者表示所有比target具有更大的time stamp的dependent),则该―!‖修饰符将会使该命令施行于这两个宏所描述的每一个独立的文件上。

NMAKE还提供了一些语法可以在commands block中表示相应的dependent line中第一个dependent的文件名组成。例如:

foo.exe : c:\sample\first.obj c:\sample\second.obj

link %s

NMAKE将―link %s‖解释为:

link c:\sample\first.obj

如果将命令改为―link %|pfF.exe‖,则NMAKE将之解释为:

link c:\sample\first.exe

%s表示全文件名,%|[part]F表示文件名中的某个部分,part可以是下列字符中的一个或多个,如果part为空,%|F与%s的意思相同:

1) d:盘符;

2) p:路径;

3) f:文件基本名;

4) e:文件扩展名;

3.3 推导规则(Inference Rules)

Inference rules(下文简称IR)是一个模板,它用于决定如何从一个具有某种扩展名的文件构造出一个具有另一种扩展名的文件。NMAKE通过IR来确定用来更新target的命令以及推导target的dependents。IR的好处在于它满足了像我这样的懒人的需要。只要提供了正确的IR,则描述语句块就可以极大地化简。请看下面的例子:

foo.obj :

上面的语句将会运作得很好。是不是觉得很吃惊呢?事实上,NMAKE在处理该语句的时候,它首先在当前目录下搜索基本名为foo的文件(假设当前目录下有一个foo.c文件)。然后它查找一个后缀列表(suffix list),里面的每一项包含了从一种类型的文件构造另一种类型的文件需要调用的命令和参数的相关信息。在NMAKE预定义的列表中,foo.c到foo.obj 的构造命令为CL。最后NMAKE调用CL,编译foo.c。呵呵,这么一长串的操作一条简单的语句就搞定了,是不是很方便呢!

当出现下列情况之一时,NMAKE就会尝试使用IR:

NMAKE遇到一个没有任何命令的描述语句块。此时NMAKE就会搜索后缀列表,试图找到一个匹配的命令来构造target。

无法找到某个dependent,并且该dependent没有作为target出现在其它dependent line 中(即它不是一个pseudotarget)。此时NMAKE就会搜索给定的目录以及后缀列表,试图找到一个IR来构造出该dependent。

一个target没有dependent,并且描述语句块中没有给出指令。此时NMAKE就会试图找出一个IR来构造出该target。

一个target在NMAKE的命令行中给出,但在makefile里没有该target的相关信息(或根本就没有makefile)。此时NMAKE就会试图找出一个IR来构造出该target。

定义一个IR的语法如下:

[{frompath}].fromext[{topath}].toext;

commands

注意,各语法元素之间不能有任何空格。Dependent的后缀名在fromext中给出,target 的后缀名在toext中给出。Frompath 和topath是可选的,分别给出了搜索的路径。在每个IR 的定义中只能分别为每一个后缀名给出一个搜索路径。如果想要指定多个搜索路径,就必须定义多个IR。并且,如果你为一个后缀指定了搜索路径,那么你也必须为另一个后缀指定搜索路径。即是说,fromext和topath只要有一个存在,则另一个也必须存在。你可以使用{.}或{}来表示当前目录。

另外,要注意的是,如果你在IR中指定了搜索路径,则在dependent lien中也必须指定同样的路径,否则IR将不会应用于dependent line上,例如:

{..\proj}.exe{..\proj}.obj:

该IR不会用于下列语句上:

project1.exe : project1.obj

但会用于下列语句上:

{..\proj}project1.exe : {..\proj}project1.obj

NMAKE本身提供了一个预定义的后缀列表,内容如下:

Rule Command Default Action

.asm.exe $(AS)$(AFLAGS) $*.asm ML $*.ASM

.asm.obj $(AS)$(AFLAGS) /c $*.asm ML /c $*.ASM

.c.exe $(CC)$(CFLAGS) $*.c CL $*.C

.c.obj $(CC)$(CFLAGS) /c $*.c CL /c $*.C

.cpp.exe $(CPP)$(CPPFLAGS) $*.cpp CL $*.CPP

.cpp.obj $(CPP)$(CPPFLAGS) /c $*.cpp CL /c $*.CPP

.cxx.exe $(CXX) $(CXXFLAGS) $*.cxx CL $*.CXX

.cxx.obj $(CXX) $(CXXFLAGS) /c $*.cxx CL /c $*.CXX

.bas.obj $(BC) $(BFLAGS) $*.bas; BC $*.BAS;

.cbl.exe $(COBOL) $(COBFLAGS) $*.cbl, $*.exe; COBOL $*.CBL, $*.EXE;

.cbl.obj $(COBOL) $(COBFLAGS) $*.cbl; COBOL $*.CBL;

.for.exe $(FOR) $(FFLAGS) $*.for FL $*.FOR

.for.obj $(FOR) /c $(FFLAGS) $*.for FL /c $*.FOR

.pas.exe $(PASCAL) $(PFLAGS) $*.pas PL $*.PAS

.pas.obj $(PASCAL) /c $(PFLAGS) $*.pas PL /c $*.PAS

.rc.res $(RC) $(RFLAGS) /r $* RC /r $*

在上表中,类似AFLAG和CFLAG这种被包含在括号里面的是未定义的宏,通过在makefile中对这些宏给出定义,可以为这些命令指定编译器和参数。例如:$(AS)$(AFLAGS) $*.asm

AS宏用于指定编译器,NMAKE中默认为ML;AFLAGS宏用于给出编译器参数,NMAKE将之留给用户定义,默认为空。所以默认的操作为:

ML $*.asm

这里可以看到将宏展开的语法,就是将宏的名字用圆括号括起来,然后在前面加上一个美元符号。另外需要说明的是,‖$*‖是NMAKE预定义的一个特殊的宏,其等于target的路径加上target的基本名。

3.4 宏(MACRO)

这个相信大家都十分熟悉了。在makefile中通过使用宏将可以获得很大的灵活性。下面就是在makefile中定义宏的语法:

macroname=string

在makefile中,macroname是宏的名字,其可以是任何字母,数字和下划线的组合,最多可以有1024个字符。另外要注意的是,macroname是大小写敏感的。string是宏的定义体,可以有高达65510个字符。任何包含0个字符或只包含空白的字符串都被视为空字串(null string),此时,该宏也被视为NULL,任何其出现的地方,都会被替换为空白。

在使用宏时,还应知道以下几个具有特殊意义的符号:

l . # 用于注释,例如:

command=ML # compile asm file

2. \ 将宏定义分作多行来写,例如:

LINKCMD = link myapp \

another, , NUL, mylib, myapp

―\‖后面的回车换行符会被空格替换,上面两行相当于:

LINKCMD = link myapp another, , NUL, mylib, myapp

3. $ 将宏展开,用法在后面介绍。

4. ^ 如果要在宏中包含以上符号,但又不使用它们的特殊语义,则可以这样:

dir=c:\windows^\

此时,dir相当于字符串‖c:\windows\‖。

以下是一些语法上的细节:

1) 在定义宏时,宏名字的第一个字符必须是该行的第一个字符;

2) 每行只能定义一个宏;

3) 在‖=‖两边可以有空格,但它们都会被忽略;

4) 在宏定义体中可以有空格,它们都会被视为宏的一部分;

除了可以在makefile中定义宏之外,宏定义也可以出现在NMAKE命令行中。此时,如果在宏定义中有任何空白,则必须用双引号将之括起来,例如:

NMAKE "LINKCMD = LINK /MAP"

NMAKE LINKCMD="LINK /MAP"

而像下面这样则是不允许的(等号两边有空格):

NMAKE LINKCMD = "LINK /MAP"

使用宏的语法如下(注意,整个语句中不能有任何空格):

$(macroname)

NMAKE会将整个语句用宏替换掉。如果宏未定义,NMAKE会用空白替换之,不会产生任何错误。如果宏的名字只有一个字符,则括号可以省略,例如:$L和$(L)是等价的。

NMAKE为宏的使用还提供了一个很有用的特性,那就是substitution(子替换)。即是在展开宏的时候,你还可以指明将展开的宏中的某部分文本用另外的文本替换掉。例如:SOURCE=one.c two.c

foo.exe : $(SOURCE:.c=.obj)

LINK $**;

展开来就是这样:

SOURCE=one.c two.c

foo.exe : one.obj two.obj

LINK one.obj two.obj;

语句$(SOURCE:.c=.obj)表示将SOURCE中出现的所有‖.c‖替换为‖.obj‖。

由以上的例子可以看出,substitution的语法如下(注意,没有空格):

$(macroname:str1=str2)

此外,NMAKE还提供了4组预定义的宏,它们分别是文件名宏,递归宏,命令宏和参数宏。它们都可以被重新定义,但可能会引起一些不必要的麻烦,因为它们被广泛使用。正所谓―动一发而牵全身‖,一个小小的改动,甚至有可能会影响到太阳黑子的运动(蝴蝶效应),这就是使用宏的最大的弊端。

文件名宏

在commands block中使用,以表示特定的文件名,包括:

1) $@ 用来表示相关联的dependent line中第一个target的全名(包括路径)。

2) $$@ 同上,但只能用在dependent line中。

3) $* target的路径加基本名。

4) $** 相应的dependent line中的所有dependent。

5) $? 相应的dependent line中的所有time stamp大于target的dependent。

6) $< 同上,但只能用在IR中。

下面是一个例子:

DIR = c:\objects

$(DIR)\a.obj : a.obj

COPY a.obj $@

最后一句展开来就相当于:copy a.obj c:\objects\a.obj

另外,在使用以上这些宏的时候,还可以通过以下的字符来提取文件名中的某一个部分:

D 路径

B 基本名

F 基本名加扩展名

R 路径加基本名

例如:如果$@表示c:\objects\a.object,则

$(@D)c:\objects

$(@B)a

$(@F) a.obj

$(@R)c:\objects\a

递归宏

有3个,它们都是用来在makefile中方便地进行NMAKE的递归调用,它们分别是:

1) MAKE

表示运行当前makefile的NMAKE程序的名字。例如,如果你在控制台用以下语句运行makefile:

NMAKE her.mak

则MAKE就等于NMAKE。

但如果你将NMAKE.EXE改名为FUCK.EXE,那么你运行makefile的命令就应该改为:FUCK her.mak

此时,MAKE就等于FUCK。

2) MAKEDIR

表示你调用NMAKE时所在的目录。

3) MAKEFLAGS

表示你运行当前makefile时使用的NMAKE参数。

这几个宏在build程序的不同版本时特别有用,例如:

all : vers1 vers2

vers1 :

cd \vers1

$(MAKE)

cd ..

vers2 :

cd \vers2

$(MAKE) /F vers2.mak

cd ..

NMAKE会分别在.\vers1和.\vers2目录下运行vers1.mak和vers2.mak。

命令宏和参数宏

命令宏表示Microsoft的编译程序(真的很会做生意,任何时候都不忘自己的产品),而参数宏则是表示传递给这些编译器的参数,在默认情况下,参数宏都是未定义的。当然,你可以重新定义它们,让它们表示Boland的编译程序和参数。

命令宏对应的参数宏

1) AS ml,M的汇编编译器。AFLAGS

2) BC bc,M的BASIC编译器。BFLAGS

3) CC cl,M的C编译器。CFLAGS

4) COBOL cobol,M的COBOL编译器。COBFLAGS

5) CPP cl,M的C++编译器。CPPFLAGS

6) CXX cl,M的C++编译器。CXXFLAGS

7) FOR fl,M的FORTRAN编译器。FFLAGS

8) PASCAL pl,M的PASCAL编译器。PFLAGS

9) RC rc,M的资源编译器。RFLAGS

makefile新手教程

makefile新手教程 2013-11-08 本文翻译自https://www.360docs.net/doc/0016098033.html,/tutorials/ Makefiles --通过示例说明 编译源代码是沉闷的,尤其是当你想要include一些源代码,却又每次都需要手动敲编译命令的时候。 恩,我有个好消息告诉你...你用手敲命令行去编译的日子(基本上)一去不复返了,因为你将会学习如何编写Makefile。Makefile是配合make命令使用的特殊文件,make命令则会帮助你自动地、神奇般地管理你的工程。 这里你需要先准备以下文件: main.cpp

hello.cpp factorial.cpp functions.cpp 我建议你新建一个空的目录,然后将上述4个文件放入其中。

注意:我使用g++命令编译。你完全可以换成别的编译器 make工具 如果你运行make 它会去寻找当前目录下名字为makefile的文件,并按里面的内容执行。 如果你有很多makefile文件,那么可以用这个命令来执行: 当然还有其他的参数来使用make工具,详情请man make。 构建过程 1.编译器编译源代码文件,输出到目标文件 2.链接器将目标文件链接,并创建可执行文件 手动编译 手动编译并获得可执行文件,是一种琐碎的方式: 基本的Makefile

基本的makefile文件组成如下: 将此语法应用到我们的例子中,就是: all: g++ main.cpp hello.cpp factorial.cpp -o hello 我们将此文件保存为Makefile-1。要运行此makefile,则输入:make -f Makefile-1 在这个例子中可以看到,我们的target叫做all。这是makefile中的默认target。若无指定参数,make工具将按这个target 执行。 我们同时发现,这个例子中的target,也就是all,没有dependencies(依赖文件),因此make会安全地执行后续的system commands(系统命令)。 最后,make根据我们设定的命令完成了编译。 使用依赖文件 有时候使用多个不同的target会很有用,因为当你只修改了工程中的一个文件时,不必重新编译所有代码,只需要编译修改过的部分。比如:

windows下的makefile教程

windows下的makefile教程 https://www.360docs.net/doc/0016098033.html,/mirror_hc/archive/2008/03/26/2221117.aspx joeliu 制作4/19/2011 22:10:29 1. 先说几句废话 以前看书时经常遇到makefile,nmake这几个名词,然后随之而来的就是一大段莫名其妙的代码,把我看得云里雾里的。在图书馆和google上搜了半天,也只能找到一些零零星星的资料,把我一直郁闷得不行。最近因缘巧合,被我搞到了一份传说中的MASM6手册,终于揭开了NMAKE的庐山真面目。想到那些可能正遭受着同样苦难的同志以及那些看到E文就头晕的兄弟,所以就写了这篇文章。假如大家觉得有帮助的话,记得回复一下,当作鼓励!如果觉得很白痴,也请扔几个鸡蛋.本文是总结加翻译,对于一些关键词以及一些不是很确定的句子,保留了英文原版,然后再在括号里给出自己的理解以作参考。由于水平有限,加上使用NMAKE的经验尚浅,有不对的地方大家记得要指正唷。MASM6手册在AOGO(好像是)可以download,在我的BLOG上有到那的链接。 2. 关于NMAKE Microsoft Program Maintenance Utility,外号NMAKE,顾名思义,是用来管理程序的工具。其实说白了,就是一个解释程序。它处理一种叫做makefile的文件(以mak为后缀),解释里面的语句并执行相应的指令。我们编写makefile文件,按照规定的语法描述文件之间的依赖关系,以及与该依赖关系相关联的一系列操作。然后在调用NMAKE时,它会检查所有相关的文件,如果目标文件(target file,下文简称target,即依赖于其它文件的文件)的time stamp(就是文件最后一次被修改的时间,一个32位数,表示距离1980年以来经过的时间,以2秒为单位)小于依赖文件(dependent file,下文简称dependent,即被依赖的文件)的time stamp,NMAKE就执行与该依赖关系相关联的操作。请看下面这个例子:foo.exe : first.obj second.obj link first.obj,second.obj 第一行定义了依赖关系,称为dependency line;第二行给出了与该依赖关系相关联的操作,称为command line。因为foo.exe由first.obj和second.obj连接而成,所以说foo.exe依赖于first.ogj和second.obj,即foo.exe为target,first.obj和second.obj为dependent。如果first.obj和second.obj中的任何一个被修改了(其time stamp更大),则调用link.exe,重新连接生成foo.exe。这就是NMAKE的执行逻辑。 综上,NMAKE的核心就是这3个家伙——依赖关系,操作和判定逻辑(target.timestamp < dependent.timestamp,如果为true,就执行相应操作)。 3. MAKEFILE的语法 现在详细讨论一下makefile的语法。makefile就像一个玩具型的程序语言,麻雀虽小,但五脏具全。makefile的组成部分包括:描述语句(description block),推导规则(inference rules),宏和指令(directive)。 描述语句就是dependent lines和command lines的组合;推导规则就是预先定义好的或用户自己定义的依赖关系和关联命令;宏就不用说了吧;指令就是内定的一些可以被NMAKE识别的控制命令,提供了很多有用的功能。 3.1 特殊符号

Makefile两个实验

实验十四Makefile工程管理器 14.1 编写包含多文件的Makefile 【实验内容】 编写一个包含多文件的Makefile。 【实验目的】 通过对包含多文件的Makefile的编写,熟悉各种形式的Makefile,并且进一步加深对Makefile中用户自定义变量、自动变量及预定义变量的理解。 【实验平台】 PC机、CentOS 5 操作系统、gcc等工具。 【实验步骤】 1.用vi在同一目录下编辑两个简单的Hello程序,如下所示: #hello.c #include "hello.h" int main() { printf("Hello everyone!\n"); } #hello.h #include 2.仍在同一目录下用vim编辑Makefile,不使用变量替换,用一个目标体实现(即直接将 hello.c和hello.h编译成hello目标体)。并用make验证所编写的Makefile是否正确。 3.将上述Makefile使用变量替换实现。同样用make验证所编写的Makefile是否正确 4.用编辑另一Makefile,取名为Makefile1,不使用变量替换,但用两个目标体实现(也 就是首先将hello.c和hello.h编译为hello.o,再将hello.o编译为hello),再用make 的‘-f’选项验证这个Makefile1的正确性。 5.将上述Makefile1使用变量替换实现 【详细步骤】 1.用vi打开上述两个代码文件…hello.c?和…hello.h? 2.在shell命令行中用gcc尝试编译,使用命令:…gcc hello.c -o hello?,并运行hello可执 行文件查看结果。 3.删除此次编译的可执行文件:rm –rf hello 4.用vim编辑Makefile,如下所示: hello:hello.c hello.h gcc hello.c -o hello 5.退出保存,在shell中键入:make查看结果 6.再次用vim打开Makefile,用变量进行替换,如下所示: OBJS :=hello.o CC :=gcc hello:$(OBJS) $(CC) $^ -o $@ 7.退出保存,在shell中键入:make查看结果

Makefile超强经典教程

Makefile经典教程 0 Makefile概述 (2) 0.1关于程序的编译和链接 (2) 1 Makefile介绍 (3) 1.1 Makefile的规则 (4) 1.2一个示例 (4) 1.3 make是如何工作的 (6) 1.4 makefile中使用变量 (7) 1.5让make自动推导 (8) 1.6另类风格的makefile (9) 1.7清空目标文件的规则 (10) 2 Makefile总述 (11) 2.1 Makefile里有什么? (11) 2.2Makefile的文件名 (12) 2.3引用其它的Makefile (12) 2.4环境变量MAKEFILES (13) 2.5 make的工作方式 (13) 3 Makefile书写规则 (14) 3.1规则举例 (14) 3.2规则的语法 (14) 3.3在规则中使用通配符 (15) 3.4文件搜寻 (16) 3.5伪目标 (17) 3.6多目标 (19) 3.7静态模式 (20) 3.8自动生成依赖性 (22) 4 Makefile书写命令 (24) 4.1显示命令 (24) 4.2命令执行 (25) 4.3命令出错 (25) 4.4嵌套执行make (26) 4.5定义命令包 (29) 1

0 Makefile概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。 在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。 0.1关于程序的编译和链接 在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是.obj 文件,UNIX

Linux下Makefile简单教程

目录 一:Makefile基本规则 1.1示例 1.2 隐式规则 1.3 伪目标 1.4 搜索源文件 二:变量 2.1使用变量定义变量值 2.2追加变量 三:条件判断 四:函数

Linux下Makefile总结 ——一步 MakeFile可以看做是一种简单的编程语言,其诞生的本质目的是实现自动化编译。 以Linux下gcc-c编译器为例,编译一个c语言程序需要经过以下几个步骤: 1.将c语言源程序预处理,生成.i文件; 2.预处理后的.i语言编译成汇编语言,生成.s文件; 3.汇编语言经过汇编,生成目标文件.o文件; 4.将各个模块的.o文件链接起来,生成一个可执行程序文件。 我们知道,在Visual C++6.0中,可以新建一个工程,在一个工程当中能够包含若干个c语言文件,则编译的时候直接编译整个工程便可。Linux下无法为多个c语言文件新建工程,但可以通过MakeFile实现它们的整合编译。 如上gcc-c编译步骤,如果使用Makefile则过程为: .C文件——>.o文件——>可执行文件 当然,Makefile中也加入了自己的设置变量方法与集成了一些函数,能够更有效地方便用户使用。 /**************************分隔符********************************/

一:Makefile基本规则 1.1示例 target ... : prerequisites ... command ... ... target也就是一个目标文件,可以是Object File,也可以是执行文件。prerequisites就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。(任意的Shell命令) 为了方便理解,我们来看一个示例: /*Makefile示例*/ edit : main.o kbd.o command.o display.o / insert.o search.o files.o utils.o gcc -o edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o main.o : main.c defs.h #生成main.o gcc -c main.c

MAKEfile教程

概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE 都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML 的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——―自动化编译‖,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make 各不相同,也有不同的语法,但其本质都是在―文件依赖性‖上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make 是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。 在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX 下的GCC和CC。 关于程序的编译和链接 —————————— 在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。 编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

Make命令完全详解教程

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

一、Make程序的命令行选项和参数 Make命令参数的典型序列如下所示: make [-f makefile文件名][选项][宏定义][目标] 这里用[]括起来的表示是可选的。命令行选项由破折号“–”指明,后面跟选项,如 也可以每个选项使用一个破折号,如 Make命令本身的命令行选项较多,这里只介绍在开发程序时最为常用的三个,它们是: –k: 如果使用该选项,即使make程序遇到错误也会继续向下运行;如果没有该选项,在遇到第一个错误时make程序马上就会停止,那么后面的错误情况就不得而知了。我们可以利用这个选项来查出所有有编译问题的源文件。 –n: 该选项使make程序进入非执行模式,也就是说将原来应该执行的命令输出,

而不是执行。 –f : 指定作为makefile的文件的名称。如果不用该选项,那么make程序首先在当前目录查找名为makefile的文件,如果没有找到,它就会转而查找名为Makefile的文件。如果您在Linux下使用GNU Make的话,它会首先查找GNUmakefile,之后再搜索makefile和Makefile。按照惯例,许多Linux程序员使用Makefile,因为这样能使Makefile出现在目录中所有以小写字母命名的文件的前面。所以,最好不要使用GNUmakefile这一名称,因为它只适用于make程序的GNU版本。 当我们想构建指定目标的时候,比如要生成某个可执行文件,那么就可以在make命令行中给出该目标的名称;如果命令行中没有给出目标的话,make命令会设法构建makefile中的第一个目标。我们可以利用这一特点,将all作为makefile中的第一个目标,然后将让目标作为all所依赖的目标,这样,当命令行中没有给出目标时,也能确保它会被构建。

makefile文件教程

Makefile学习教程: 跟我一起写Makefile o0 Makefile概述 ?0.1 关于程序的编译和链接o1 Makefile 介绍 ? 1.1 Makefile的规则 ? 1.2 一个示例 ? 1.3 make是如何工作的 ? 1.4 makefile中使用变量 ? 1.5 让make自动推导 ? 1.6 另类风格的makefile ? 1.7 清空目标文件的规则o2 Makefile 总述 ? 2.1 Makefile里有什么? ? 2.2Makefile的文件名 ? 2.3 引用其它的Makefile ? 2.4 环境变量MAKEFILES ? 2.5 make的工作方式 o3 Makefile书写规则 ? 3.1 规则举例 ? 3.2 规则的语法 ? 3.3 在规则中使用通配符 ? 3.4 文件搜寻 ? 3.5 伪目标 ? 3.6 多目标 ? 3.7 静态模式 ? 3.8 自动生成依赖性 o4 Makefile 书写命令 ? 4.1 显示命令 ? 4.2 命令执行 ? 4.3 命令出错 ? 4.4 嵌套执行make

Makefile概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix 下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU 的make。可见,makefile都成为了一种在工程方面的编译方法。 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。 在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。 1 Makefile 介绍 make命令执行时,需要一个Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。 首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU 的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来 告诉make命令如何编译和链接这几个文件。我们的规则是: 1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。 2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。

Makefile经典教程(最掌握这部分足够)

Makefile经典教程 0Makefile概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质

都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992标准的(POSIX.2)。 在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。 0.1关于程序的编译和链接 在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows 下也就是.obj文件,UNIX下是.o文件,即Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。 编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。 链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而

Makefile入门经典

Makefile 介绍 ——————— make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。 首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是: 1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。 2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。 3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。 只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。 一、Makefile的规则 在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。target ... : prerequisites ... command ... ... target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。 prerequisites就是,要生成那个target所需要的文件或是目标。 command也就是make需要执行的命令。(任意的Shell命令) 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。 说到底,Makefile的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。还不尽然,这是Makefile的主线和核心,但要写好一个Makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。内容还多着呢。:) 二、一个示例 正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。 edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o

(完整版)《Linux操作系统及应用项目教程》习题答案.doc

《系统管理、网络编程与服务器搭建-Linux版》 课后习题答案 1.8练习题 一、填空题 1.GNU's Not Unix 的递归缩写 2.内核( kernel)、命令解释层( Shell 或其他操作环境)、实用工具 4.Copyleft (无版权) General Public License , GPL ) 5.FSF, Free Software Foundation 6.便携式操作系统接口( Portable Operating System Interface ) 7. 企业应用个人应用 8. 内核版本发行版本 9. swap 交换分区/ (根)分区 10.root 11.X Server 、 X Client 和通信通道 12.system-config-rootpassword 二、选择题 1. B 2. C 3. B 4. A 5. D 6. C

2.7练习题 一、填空题 1.区分 Tab 2.分号 3.反斜杠“”“ >” 4.“ & ” 二、选择题 1.C 2.B 3.C 4.D 5.C 6.C 7.C 8.B 9.C 10.B 3.8练习题 一、填空题 1.多用户多任务 2.普通用户帐户超级用户帐户(root) 3.0 500 4.主组群 500 5.主组群附属组群。 6./etc/passwd 7.读取 /etc/shadow 8./etc/group/etc/gshadow 二、选择题 1.A 2.C

3.D 4.C 5.C 6.CD 7.A 8.AB 4.6练习题 一、填空题 1.保存管理 2.扩展文件系统ext2/ext3/ext4 3.级块索引节点表数据块 4.树状目录“ /” 5.umask umask 777 000 6.. .. 7.隐藏文件 8.chmod a+x filename 二、选择题 1.A 2.A 3.A 4.B 5.D 6.D 5.8练习题 一、填空题 1. ISO 9660 2. 独立磁盘冗余阵列磁盘阵列软RAID硬RAID冗余 3. 逻辑卷管理器一个逻辑卷(相当于一个逻辑硬盘) 4. 索引节点数磁盘块区数

cmake是干什么的_华清远见

CMake是干什么的? linux里面装CMake是干什么的?有什么用呢?请往下看,我们来说说CMake! CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。 一、Cmake第一个程序 ? 1.编写hello.c ? 2. 编写CMakeLists.txt ? 3. 执行cmake . “.” 代表的意思是当前目录,cmake会查找该目录下的CMakeList.txt 文件 ? 4.执行过程,生成Makefile

? 5. 执行make 二、Cmake语法详解 ? 1.PROJECT PROJECT(projectname [CXX] [C] [Java]) 若是为省略[]中内容,就默认全部支持 该句话中,隐式的定义了两个变量,下面是CMakeCache.txt里面的文件内容,里面有各种刚刚系统配置的变量内容,下面我们查看两个隐藏变量的内容:

? 2. ADD_EXECUTABLE 生成可执行文件,可以忽略后缀 语法: 1.add_executable( [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...]) 2. add_executable( IMPORTED [GLOBAL]) 3. add_executable( ALIAS ) 具体更详细的可查看官网内容说明: 网址: https://https://www.360docs.net/doc/0016098033.html,/cmake/help/v3.7/command/add_executable.html?highlight=add_exe#command:add_ executable ? 3. 设置变量 语法: SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) ? 4.添加打印信息 语法: message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...)

AVR Studio使用入门

AVR Studio使用入门 本文档内容根据https://www.360docs.net/doc/0016098033.html,的教程和ATMEL公司的官方文档整理。在这里,对ourdev表示感谢。 下面介绍如何使用AVR Studio实现汇编语言和C语言代码的编译和调试。 1. AVR Studio的准备和安装 AVR Studio V4.12版本内嵌了WinAVR(AVRGCC)接口,因此可以在AVRStudio中直接创建AVRGCC工程,进而用AVR Studio调试C程序。建议使用AVR JTAGICE的用户使用这种方法。 要安装的开发工具存放在光盘的/开发工具/目录内。在安装AVR Studio的同时,如果需要使用C语言编程,需要安装GCC编译工具(也就是WINAVR)。 AVR Studio 4.12 的安装与删除: 全部使用缺省安装即可,安装成功后重启电脑。如果需要删除,进入控制面板,使用“添加/删除程序”即可。 WINAVR 的安装与删除: 全部使用缺省安装即可。如果需要删除,进入控制面板,使用“添加/删除程序”。但WinAVR PN的配置参数,仍会保存在:C:\Documents and Settings\[UserName]\Application Data\Echo Software\PN2 中。如果想将这些参数也删除,此上述目录删除即可。 2. 用AVR Studio编译汇编代码和C代码 (1)创建一个新工程 如果需要使用C语言编程,需要同时安装WinAVR(GCC编译器)。使用AVR Studio 创建工程的步骤如下:

第一步:新建工程。 打开AVR Studio,点击菜单Project->New Project后,会提示图1的对话框。如果用汇编语言编程,则在Project Type中选择Atmel AVR Assembler;如果使用C语言编程,则选择AVR GCC。在Project Name中填写自己要建立的工程名字,在Location中选择项目所在的目录,如果不清楚,请点击Help阅读帮助文件。 图1 新建工程对话框 点击Next,进入第二步。 第二步:选择调试平台和芯片型号。 图2 选择调试平台和芯片型号 图2中,左边的Debug Platform框为选择调试平台,要根据实际使用的调试工具做选择。如果是模拟仿真,选择AVR Simulator。这里的JTAGICE和 JTAGMKII是是比较常见的开发工具,而ICE40和ICE50一般很少用。右边的Device框选择所用的单片机型号。

Linux makefile 教程 非常详细,且易懂

最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到ma kefile就越看越迷糊,可能是我的理解能不行。 于是google到了以下这篇文章。通俗易懂。然后把它贴出来,方便学习。 后记,看完发现这篇文章和《Linux环境下的C编程指南》的makefile一章所讲述的惊人的相似,只是这篇文章从一个实例切入,在有些地方比较好理解。能让人看懂就是好文章。 跟我一起写 Makefile 陈皓 (CSDN) 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows 的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefil e还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写mak efile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释ma kefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的ma ke,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-19 92 标准的(POSIX.2)。

Linux_makefile_教程_非常详细,且易懂

/LQX[BPDNHILOHB B )? ? W[W - q?/LQX[ &" ?- /LQX[?9 &" \ )?PDNHILOH?? ?-? $ $ ǎ JRRJOH?- -? - ? ? 1?? ɑq? ? ? ?-? < /LQX[?9 &" \ PDNHILOH ??- ?0 ? -? ?7 ? . ?3 $?0 ?? 3 + ?L 0DNHILOH &6'1 - üü ?) PDNHILOH ? :LQRGZV ? . ?- (?.:LQGRZV ,'(.(?>-- ? 3 ? 3 -/ ? *18 PDNH- ?- ?9 5HG+DW /LQX[ PDNH ? ? - PDNH ? (? ? # J- ? ǎ,((( O 326,; -? ? & & ? ?( ? ???c .?ǎ& & ") ? ?ǎ- ?v -) ? ? ") -/?6? ") 81,; *&&<&& ?ǎ ? ")< ? üüüüüüüüüü ? )?ǎ ?") . &< ? ) ? & & - SDV G 1? ") ? :LQGRZV ?? R EM 81,; R γ2EM H F W )LOH - W? >") F RPSLOH ? ?1 / 2EM H F W )LOH · - W? ? ? OLQN ") ") ) ? / ? ǎ # - ? ?") ? ?? ??) #t)?) & & ? ? ) ? ") ? ") ? ? ) ? .?) ?ǎ ? 2 2%- ? ( ?

相关文档
最新文档