GNU Make 使用手册(中译版)

合集下载

gun make 工具

gun make 工具

GUN make 工具...GUN make 工具收藏新一篇: linux 下安装j2sdk1.4.2 | 旧一篇: Linux 组织多文件的项目2.1 基本makefile 结构GNU Make 的主要工作是读进一个文本文件,makefile 。

这个文件里主要是有关哪些文件(‘target’目的文件)是从哪些别的文件(‘dependencies’依靠文件)中产生的,用什么命令来进行这个产生过程。

有了这些信息,make 会检查磁碟上的文件,如果目的文件的时间戳(该文件生成或被改动时的时间)比至少它的一个依靠文件旧的话,make 就执行相应的命令,以便更新目的文件。

(目的文件不一定是最后的可执行档,它可以是任何一个文件。

)makefile 一般被叫做“makefile”或“Makefile”。

当然你可以在make 的命令行指定别的文件名。

如果你不特别指定,它会寻找“makefile”或“Makefile”,因此使用这两个名字是最简单的。

一个makefile 主要含有一系列的规则,如下:: ... (tab)<command> (tab)<command> . . .例如,考虑以下的makefile :=== makefile 开始=== myprog : foo.o bar.o gcc foo.o bar.o -o myprogfoo.o : foo.c foo.h bar.h gcc -c foo.c -o foo.obar.o : bar.c bar.h gcc -c bar.c -o bar.o === makefile 结束===这是一个非常基本的makefile —— make 从最上面开始,把上面第一个目的,‘myprog’,做为它的主要目标(一个它需要保证其总是最新的最终目标)。

GNU make 中文手册

GNU make 中文手册

GNU make中文手册ver - 3.8翻译整理:徐海兵2004-09-11目录Table of ContentsGNU make中文手册 (1)ver - 3.8 (1)第一章:概述 (7)1.1概述 (7)1.2准备知识 (8)第二章 GNU make 介绍 (9)2GNU make 介绍 (9)2.1Makefile简介 (10)2.2Makefile规则介绍 (11)2.3简单的示例 (12)2.4make如何工作 (13)2.5指定变量 (15)2.6自动推导规则 (16)2.7另类风格的makefile (17)2.8清除工作目录过程文件 (18)第三章:Makefile 总述 (20)3Makefile总述 (20)3.1Makefile的内容 (20)3.2makefile文件的命名 (21)3.3包含其它makefile文件 (22)3.4变量 MAKEFILES (24)3.5变量 MAKEFILE_LIST (26)3.6其他特殊变量 (26)3.7makefile文件的重建 (27)3.8重载另外一个makefile (28)3.9make如何解析makefile文件 (30)3.9.1变量取值 (30)3.9.2条件语句 (31)3.9.3规则的定义 (31)3.10总结 (31)第四章:Makefile的规则 (33)4Makefile规则 (33)4.1一个例子 (33)4.2规则语法 (34)4.3依赖的类型 (35)4.4文件名使用通配符 (36)4.4.1统配符使用举例 (37)4.4.2通配符存在的缺陷 (38)4.4.3函数wildcard (38)4.5目录搜寻 (39)4.5.1一般搜索(变量VPATH) (39)4.5.2选择性搜索(关键字vpath) (40)4.5.3目录搜索的机制 (41)4.5.4命令行和搜索目录 (44)4.5.5隐含规则和搜索目录 (44)4.5.6库文件和搜索目录 (45)4.7强制目标(没有命令或依赖的规则) (50)4.8空目标文件 (50)4.9Makefile的特殊目标 (51)4.10多目标 (54)4.11多规则目标 (55)4.12静态模式 (56)4.12.1静态模式规则的语法 (56)4.12.2静态模式和隐含规则 (58)4.13双冒号规则 (59)4.14自动产生依赖 (60)第五章:规则的命令 (63)5为规则书写命令 (63)5.1命令回显 (63)5.2命令的执行 (64)5.3并发执行命令 (65)5.4命令执行的错误 (67)5.5中断make的执行 (68)5.6make的递归执行 (69)5.6.1变量MAKE (70)5.6.2变量和递归 (71)5.6.3命令行选项和递归 (75)5.6.4-w选项 (77)5.7定义命令包 (78)5.8空命令 (80)第六章:Makefile中的变量 (81)6使用变量 (81)6.1变量的引用 (82)6.2两种变量定义(赋值) (83)6.2.1递归展开式变量 (83)6.2.2直接展开式变量 (85)6.2.3定义一个空格 (86)6.2.4“?=”操作符 (87)6.3变量的高级用法 (88)6.3.1变量的替换引用 (88)6.3.2变量的套嵌引用 (88)6.4变量取值 (92)6.5如何设置变量 (93)6.6追加变量值 (94)6.7override 指示符 (96)6.8多行定义 (98)6.9系统环境变量 (99)6.10目标指定变量 (101)6.11模式指定变量 (103)第七章:Makefile的条件执行 (104)7Makefile的条件判断 (104)7.1一个例子 (104)7.2条件判断的基本语法 (105)7.3标记测试的条件语句 (108)第八章:make的内嵌函数 (109)8make的函数 (109)8.2文本处理函数 (110)8.2.1$(subst FROM,TO,TEXT) (110)8.2.2$(patsubst PATTERN,REPLACEMENT,TEXT) (110)8.2.3$(strip STRINT) (112)8.2.4$(findstring FIND,IN) (112)8.2.5$(filter PATTERN...,TEXT).. (112)8.2.6$(filter-out PATTERN...,TEXT).. (113)8.2.7$(sort LIST) (113)8.2.8$(word N,TEXT) (114)8.2.9$(wordlist S,E,TEXT) (114)8.2.10$(words TEXT) (114)8.2.11$(firstword NAMES...).. (115)8.3文件名处理函数 (115)8.3.1$(dir NAMES...). (115)8.3.2$(notdir NAMES...).. (116)8.3.3$(suffix NAMES...).. (116)8.3.4$(basename NAMES...) (117)8.3.5$(addsuffix SUFFIX,NAMES...) (117)8.3.6$(addprefix PREFIX,NAMES...) (118)8.3.7$(join LIST1,LIST2) (118)8.3.8$(wildcard PATTERN) (119)8.4foreach 函数 (119)8.5if 函数 (120)8.6call函数 (121)8.7value函数 (123)8.8eval函数 (124)8.9origin函数 (125)8.10shell函数 (127)8.11make的控制函数 (128)8.11.1$(error TEXT...). (128)8.11.2$(warning TEXT...).. (129)第九章:执行make (130)9执行make (130)9.1指定makefile文件 (130)9.2指定终极目标 (131)9.3替代命令的执行 (133)9.4防止特定文件重建 (135)9.5替换变量定义 (136)9.6使用make进行编译测试 (137)9.7T make的命令行选项 (138)第十章:make的隐含规则 (143)10使用隐含规则 (143)10.1隐含规则的使用 (143)10.2make的隐含规则一览 (145)10.3隐含变量 (148)10.3.1代表命令的变量 (149)10.3.2命令参数的变量 (150)10.4make隐含规则链 (151)10.5模式规则 (153)10.5.1模式规则介绍 (153)10.5.2模式规则示例 (155)10.5.3自动化变量 (156)10.5.5万用规则 (160)10.5.6重建内嵌隐含规则 (161)10.6缺省规则 (162)10.7后缀规则 (162)10.8隐含规则搜索算法 (164)第十一章:使用make更新静态库文件 (166)11更新静态库文件 (166)11.1库成员作为目标 (166)11.2静态库的更新 (167)11.2.1更新静态库的符号索引表 (168)11.3make静态库的注意事项 (168)11.4静态库的后缀规则 (169)第十二章: GNU make的特点 (170)12GNU make的一些特点 (170)12.1源自System v的特点 (170)12.2源自其他版本的特点 (171)12.3GNU make自身的特点 (172)第十三章和其它版本的兼容 (174)13不兼容性 (174)第十四章 Makefile的约定 (176)14书写约定 (176)14.1基本的约定 (176)14.2规则命令行的约定 (178)14.3代表命令变量 (179)14.4安装目录变量 (180)14.5Makefile的标准目标名 (185)14.6安装命令分类 (190)第十五章 make的常见错误信息 (193)15make产生的错误信息 (193)附录1:关键字索引 (196)GNU make可识别的指示符: (196)GNU make函数: (197)GNU make的自动化变量 (197)GNU make环境变量 (198)后序 (198)关于本书本文瑾献给所有热爱Linux的程序员!本中文文档版权所有。

makefile 中文手册 第六章 _ Makefile中的变量

makefile 中文手册 第六章 _ Makefile中的变量

第六章:Makefile中的变量在Makefile中,变量是一个名字(像是C语言中的宏),代表一个文本字符串(变量的值)。

在Makefile的目标、依赖、命令中引用变量的地方,变量会被它的值所取代(与C语言中宏引用的方式相同,因此其他版本的make也把变量称之为“宏”)。

在Makefile中变量有以下几个特征:1.Makefile中变量和函数的展开(除规则命令行中的变量和函数以外),是在make读取makefile文件时进行的,这里的变量包括了使用“=”定义和使用指示符“define”定义的。

2.变量可以用来代表一个文件名列表、编译选项列表、程序运行的选项参数列表、搜索源文件的目录列表、编译输出的目录列表和所有我们能够想到的事物。

3.变量名是不包括“:”、“#”、“=”、前置空白和尾空白的任何字符串。

需要注意的是,尽管在GNUmake中没有对变量的命名有其它的限制,但定义一个包含除字母、数字和下划线以外的变量的做法也是不可取的,因为除字母、数字和下划线以外的其它字符可能会在make的后续版本中被赋予特殊含义,并且这样命名的变量对于一些shell来说是不能被作为环境变量来使用的。

4.变量名是大小写敏感的。

变量“foo”、“Foo”和“FOO”指的是三个不同的变量。

Makefile传统做法是变量名是全采用大写的方式。

推荐的做法是在对于内部定义定义的一般变量(例如:目标文件列表objects)使用小写方式,而对于一些参数列表(例如:编译选项CFLAGS)采用大写方式,但这并不是要求的。

但需要强调一点:对于一个工程,所有Makefile中的变量命名应保持一种风格,否则会显得你是一个蹩脚的程序员(就像代码的变量命名风格一样)。

5.另外有一些变量名只包含了一个或者很少的几个特殊的字符(符号)。

称它们为自动化变量。

像“$<”、“$@”、“$?”、“$*”等。

6.1变量的引用当我们定义了一个变量之后,就可以在Makefile的很多地方使用这个变量。

Gnu Make指南

Gnu Make指南

| 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程GNU make 指南蓝森林 2000年8月10日 10:56作 者: 哈少译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了make 的用法。

而 make 是所有想在 Unix (当然也包括 Linux )系统上编程的用户必须掌握的工具。

如果你写的程序中没有用到 make ,则说明你写的程序只是个人的练习程序,不具有任何实用的价值。

也许这么说有点 儿偏激,但make 实在是应该用在任何稍具规模的程序中的。

希望本文可以为中国的 Unix编程初学者提供一点儿有用的资料。

中国的 Linux 用户除了学会安装红帽子以外, 实在应该尝试写一些有用的程序。

个人想法,大家参考。

C-Scene 题目 #2多文件项目和 GNU Make 工具作者: 乔治富特 (Goerge Foot)电子邮件: george.foot@Occupation: Student at Merton College, Oxford University, England职业:学生,默尔顿学院,牛津城大学,英格兰IRC匿名: gfoot拒绝承诺:作者对于任何因此而对任何事物造成的所有损害(你所拥有或不拥有的实际的,抽象的,或者虚拟的)。

所有的损坏都是你自己的责任,而与我无关。

所有权: “多文件项目”部分属于作者的财产,版权归乔治富特1997年五月至七月。

其它部分属 CScene 财产,版权 CScene 1997年,保留所有版权。

本 CScene 文章的分发,部分或全部,应依照所有其它 CScene 的文章的条件来处理。

0) 介绍~~~~~~~~~~~~~~~本文将首先介绍为什么要将你的C源代码分离成几个合理的独立档案,什么时候需要分,怎么才能分的好。

然后将会告诉你 GNU Make 怎样使你的编译和连接步骤自动化。

GNU C编译器 中文手册

GNU C编译器 中文手册

GCC 中文手册GCCSection: GNU Tools (1)Updated: 2003/12/05Index Return to Main ContentsNAMEgcc,g++-GNU工程的C和C++编译器(egcs-1.1.2)总览(SYNOPSIS)gcc[option|filename ]...g++[option|filename ]...警告(WARNING)本手册页内容摘自GNU C编译器的完整文档,仅限于解释选项的含义.除非有人自愿维护,否则本手册页不再更新.如果发现手册页和软件之间有所矛盾,请查对Info文件, Info文件是权威文档.如果我们发觉本手册页的内容由于过时而导致明显的混乱和抱怨时,我们就停止发布它.不可能有其他选择,象更新Info文件同时更新man手册,因为其他维护GNU CC的工作没有留给我们时间做这个. GNU 工程认为man手册是过时产物,应该把时间用到别的地方.如果需要完整和最新的文档,请查阅Info文件`gcc’或Using and Porting GNU CC (for version 2.0) (使用和移植GNU CC 2.0) 手册.二者均来自Texinfo原文件 gcc.texinfo.描述(DESCRIPTION)C和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的语言,但是对编译器来说,后缀名控制着缺省设定:gcc认为预处理后的文件(.i)是C文件,并且设定C形式的连接.g++认为预处理后的文件(.i)是C++文件,并且设定C++形式的连接.源文件后缀名指出语言种类以及后期的操作:.c C源程序;预处理,编译,汇编.C C++源程序;预处理,编译,汇编.cc C++源程序;预处理,编译,汇编.cxx C++源程序;预处理,编译,汇编.m Objective-C源程序;预处理,编译,汇编.i 预处理后的C文件;编译,汇编.ii 预处理后的C++文件;编译,汇编.s 汇编语言源程序;汇编.S 汇编语言源程序;预处理,汇编.h 预处理器文件;通常不出现在命令行上其他后缀名的文件被传递给连接器(linker).通常包括:.o 目标文件(Object file).a 归档库文件(Archive file)除非使用了-c, -S,或-E选项(或者编译错误阻止了完整的过程),否则连接总是最后的步骤.在连接阶段中,所有对应于源程序的.o文件, -l库文件,无法识别的文件名(包括指定的 .o目标文件和.a库文件)按命令行中的顺序传递给连接器.选项(OPTIONS)选项必须分立给出: `-dr’完全不同于`-d -r ’.大多数`-f’和`-W’选项有两个相反的格式: -fname和 -fno-name (或-Wname和-Wno-name).这里只列举不是默认选项的格式.下面是所有选项的摘要,按类型分组,解释放在后面的章节中.总体选项(Overall Option)-c -S -E -o file -pipe -v -x language语言选项(Language Option)-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs警告选项(Warning Option)-fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings调试选项(Debugging Option)-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program优化选项(Optimization Option)-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3预处理器选项(Preprocessor Option)-Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef汇编器选项(Assembler Option)-Wa,option连接器选项(Linker Option)-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol目录选项(Directory Option)-Bprefix -Idir -I- -Ldir目标机选项(Target Option)-b machine -V version配置相关选项(Configuration Dependent Option)M680x0 选项-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-floatVAX选项-mg -mgnu -munixSPARC选项-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypressConvex选项-margcount -mc1 -mc2 -mnoargcountAMD29K选项-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registersM88K选项-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structsRS6000选项-mfp-in-toc -mno-fop-in-tocRT选项-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-returnMIPS选项-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocppi386选项-m486 -mno-486 -msoft-float -mno-fp-ret-in-387HPPA选项-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-coloni960选项-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align DEC Alpha选项-mfp-regs -mno-fp-regs -mno-soft-float -msoft-floatSystem V选项-G -Qy -Qn -YP,paths -Ym,dir代码生成选项(Code Generation Option)-fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm总体选项(Overall Option)-x language明确指出后面输入文件的语言为language (而不是从文件名后缀得到的默认选择).这个选项应用于后面所有的输入文件,直到遇着下一个`-x’选项. language的可选值有`c’, `objective-c’, `c-header’, `c++’, `cpp-output’, `assembler’,和`assembler-with-cpp’.-x none关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用过`-x’选项).如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x’选项(或文件名后缀)告诉 gcc从哪里开始,用`-c’, `-S’,或`-E’选项告诉gcc到哪里结束.注意,某些选项组合(例如, `-x cpp-output -E’)使gcc不作任何事情.-c编译或汇编源文件,但是不作连接.编译器输出对应于源文件的目标文件.缺省情况下, GCC通过用`.o’替换源文件名后缀`.c’, `.i’, `.s’,等等,产生目标文件名.可以使用-o选项选择其他名字.GCC忽略-c选项后面任何无法识别的输入文件(他们不需要编译或汇编).-S编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文件.缺省情况下, GCC通过用`.o’替换源文件名后缀`.c’, `.i’,等等,产生目标文件名.可以使用-o选项选择其他名字.GCC忽略任何不需要编译的输入文件.-E预处理后即停止,不进行编译.预处理后的代码送往标准输出.GCC忽略任何不需要预处理的输入文件.-o file指定输出文件为file.该选项不在乎GCC产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的C代码.由于只能指定一个输出文件,因此编译多个输入文件时,使用`-o’选项没有意义,除非输出一个可执行文件.如果没有使用`-o’选项,默认的输出结果是:可执行文件为`a.out’, `source.suffix ’的目标文件是`source.o’,汇编文件是 `source.s’,而预处理后的C源代码送往标准输出.-v(在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号.-pipe在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的汇编器不能从管道读取数据. GNU的汇编器没有这个问题.语言选项(LANGUAGE OPTIONS)下列选项控制编译器能够接受的C "方言":-ansi支持符合ANSI标准的C程序.这样就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字,以及诸如unix和vax这些表明当前系统类型的预定义宏.同时开启不受欢迎和极少使用的ANSI trigraph特性,以及禁止`$’成为标识符的一部分.尽管使用了`-ansi’选项,下面这些可选的关键字, __asm__, __extension__, __inline__和__typeof__仍然有效.你当然不会把他们用在ANSI C程序中,但可以把他们放在头文件里,因为编译包含这些头文件的程序时,可能会指定 `-ansi’选项.另外一些预定义宏,如__unix__和__vax__,无论有没有使用 `-ansi’选项,始终有效.使用`-ansi’选项不会自动拒绝编译非ANSI程序,除非增加`-pedantic’选项作为 `-ansi’选项的补充.使用`-ansi’选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用;这样就不会干扰在其他地方使用这些名字的程序了.-fno-asm不把asm, inline或typeof当作关键字,因此这些词可以用做标识符.用 __asm__, __inline__和__typeof__能够替代他们. `-ansi’ 隐含声明了`-fno-asm’.-fno-builtin不接受不是两个下划线开头的内建函数(built-in function).目前受影响的函数有_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy,和strlen. `-ansi’选项能够阻止alloca和_exit成为内建函数.-fhosted按宿主环境编译;他隐含声明了`-fbuiltin’选项,而且警告不正确的main函数声明.-ffreestanding按独立环境编译;他隐含声明了`-fno-builtin’选项,而且对main函数没有特别要求.(译注:宿主环境(hosted environment)下所有的标准库可用, main函数返回一个int值,典型例子是除了内核以外几乎所有的程序.对应的独立环境(freestanding environment)不存在标准库,程序入口也不一定是 main,最明显的例子就是操作系统内核.详情参考gcc网站最近的资料)-fno-strict-prototype对于没有参数的函数声明,例如`int foo ();’,按C风格处理---即不说明参数个数或类型. (仅针对C++).正常情况下,这样的函数foo在C++中意味着参数为空.-trigraphs支持ANSI C trigraphs. `-ansi’选项隐含声明了`-trigraphs’.-traditional试图支持传统C编译器的某些方面.详见GNU C手册,我们已经把细节清单从这里删除,这样当内容过时后,人们也不会埋怨我们.除了一件事:对于C++程序(不是C), `-traditional’选项带来一个附加效应,允许对 this赋值.他和`-fthis-is-variable’选项的效果一样.-traditional-cpp试图支持传统C预处理器的某些方面.特别是上面提到有关预处理器的内容,但是不包括 `-traditional’选项的其他效应.-fdollars-in-identifiers允许在标识符(identifier)中使用`$’字符(仅针对C++).你可以指定 `-fno-dollars-in-identifiers’选项显明禁止使用`$’符. (GNU C++在某些目标系统缺省允许`$’符,但不是所有系统.)-fenum-int-equiv允许int类型到枚举类型(enumeration)的隐式转换(仅限于C++).正常情况下GNU C++允许从 enum到int的转换,反之则不行.-fexternal-templates为模板声明(template declaration)产生较小的代码(仅限于C++),方法是对于每个模板函数 (template function),只在定义他们的地方生成一个副本.想要成功使用这个选项,你必须在所有使用模板的文件中,标记`#pragma implementation’ (定义)或`#pragma interface’ (声明).当程序用`-fexternal-templates’编译时,模板实例(template instantiation) 全部是外部类型.你必须让需要的实例在实现文件中出现.可以通过typedef实现这一点,他引用所需的每个实例.相对应的,如果编译时使用缺省选项`-fno-external-templates’,所有模板实例明确的设为内置.-fall-virtual所有可能的成员函数默认为虚函数.所有的成员函数(除了构造子函数和new或delete 成员操作符)视为所在类的虚函数.这不表明每次调用成员函数都将通过内部虚函数表.有些情况下,编译器能够判断出可以直接调用某个虚函数;这时就直接调用.-fcond-mismatch允许条件表达式的第二和第三个参数的类型不匹配.这种表达式的值是void.-fthis-is-variable允许对this赋值(仅对C++).合并用户自定义的自由存储管理机制到C++后,使可赋值的 `this’显得不合时宜.因此,默认情况下,类成员函数内部对this赋值是无效操作.然而为了向后兼容,你可以通过`-fthis-is-variable’选项使这种操作有效.-funsigned-char把char定义为无符号类型,如同unsigned char.各种机器都有自己缺省的char类型.既可能是unsigned char也可能是signed char .理想情况下,当依赖于数据的符号性时,一个可移植程序总是应该使用signed char或unsigned char.但是许多程序已经写成只用简单的char,并且期待这是有符号数(或者无符号数,具体情况取决于编写程序的目标机器).这个选项,和它的反义选项,使那样的程序工作在对应的默认值上.char的类型始终应该明确定义为signed char或unsigned char,即使它表现的和其中之一完全一样.-fsigned-char把char定义为有符号类型,如同signed char.这个选项等同于`-fno-unsigned-char’,他是the negative form of `-funsigned-char’的相反选项.同样, `-fno-signed-char’等价于 `-funsigned-char’.-fsigned-bitfields-funsigned-bitfields-fno-signed-bitfields-fno-unsigned-bitfields如果没有明确声明`signed’或`unsigned’修饰符,这些选项用来定义有符号位域 (bitfield)或无符号位域.缺省情况下,位域是有符号的,因为他们继承的基本整数类型,如int,是有符号数.然而,如果指定了`-traditional’选项,位域永远是无符号数.-fwritable-strings把字符串常量存储到可写数据段,而且不做特别对待.这是为了兼容一些老程序,他们假设字符串常量是可写的. `-traditional’选项也有相同效果.篡改字符串常量是一个非常糟糕的想法; ``常量’’就应该是常量.预处理器选项(Preprocessor Option)下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理.如果指定了`-E’选项, GCC只进行预处理工作.下面的某些选项必须和`-E’选项一起才有意义,因为他们的输出结果不能用于编译.-include file在处理常规输入文件之前,首先处理文件file,其结果是,文件file的内容先得到编译. 命令行上任何`-D’和`-U’选项永远在`-include file’之前处理, 无论他们在命令行上的顺序如何.然而`-include’和`-imacros’选项按书写顺序处理.-imacros file在处理常规输入文件之前,首先处理文件file,但是忽略输出结果.由于丢弃了文件file的输出内容, `-imacros file’选项的唯一效果就是使文件file中的宏定义生效, 可以用于其他输入文件.在处理`-imacrosfile’选项之前,预处理器首先处理`-D’ 和`-U’选项,并不在乎他们在命令行上的顺序.然而`-include’和 `-imacros’选项按书写顺序处理.-idirafter dir把目录dir添加到第二包含路径中.如果某个头文件在主包含路径(用`-I’添加的路径)中没有找到,预处理器就搜索第二包含路径.-iprefix prefix指定prefix作为后续`-iwithprefix’选项的前缀.-iwithprefix dir把目录添加到第二包含路径中.目录名由prefix和dir合并而成,这里 prefix被先前的`-iprefix’选项指定. -nostdinc不要在标准系统目录中寻找头文件.只搜索`-I’选项指定的目录(以及当前目录,如果合适).结合使用`-nostdinc’和`-I-’选项,你可以把包含文件搜索限制在显式指定的目录.-nostdinc++不要在C++专用标准目录中寻找头文件,但是仍然搜索其他标准目录. (当建立`libg++’时使用这个选项.) -undef不要预定义任何非标准宏. (包括系统结构标志).-E仅运行C预处理器.预处理所有指定的C源文件,结果送往标准输出或指定的输出文件.-C告诉预处理器不要丢弃注释.配合`-E’选项使用.-P告诉预处理器不要产生`#line’命令.配合`-E’选项使用.-M [ -MG ]告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系.对于每个源文件,预处理器输出一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 `#include引用的所有文件.生成的规则可以是单行,但如果太长,就用`\’-换行符续成多行.规则显示在标准输出,不产生预处理过的C程序.`-M’隐含了`-E’选项.`-MG’要求把缺失的头文件按存在对待,并且假定他们和源程序文件在同一目录下.必须和 `-M’选项一起用.-MM [ -MG ]和`-M’选项类似,但是输出结果仅涉及用户头文件,象这样`#include file"’.忽略系统头文件如`#include <file>’.-MD和`-M’选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的`.o’替换为 `.d’产生.同时继续指定的编译工作---`-MD’不象`-M’那样阻止正常的编译任务.Mach的实用工具`md’能够合并`.d’文件,产生适用于`make’命令的单一的依赖文件.-MMD和`-MD’选项类似,但是输出结果仅涉及用户头文件,忽略系统头文件.-H除了其他普通的操作, GCC显示引用过的头文件名.-Aquestion(answer)如果预处理器做条件测试,如`#if #question(answer)’,该选项可以断言(Assert) question的答案是answer. -A-’关闭一般用于描述目标机的标准断言.-Dmacro定义宏macro,宏的内容定义为字符串`1’.-Dmacro=defn定义宏macro的内容为defn.命令行上所有的`-D’选项在 `-U’选项之前处理.-Umacro取消宏macro. `-U’选项在所有的`-D’选项之后处理,但是优先于任何 `-include’或`-imacros’选项.-dM告诉预处理器输出有效的宏定义列表(预处理结束时仍然有效的宏定义).该选项需结合`-E’选项使用.-dD告诉预处理器把所有的宏定义传递到输出端,按照出现的顺序显示.-dN和`-dD’选项类似,但是忽略宏的参量或内容.只在输出端显示`#define name.汇编器选项(ASSEMBLER OPTION)-Wa,option把选项option传递给汇编器.如果option含有逗号,就在逗号处分割成多个选项.连接器选项(LINKER OPTION)下面的选项用于编译器连接目标文件,输出可执行文件的时候.如果编译器不进行连接,他们就毫无意义.object-file-name如果某些文件没有特别明确的后缀a special recognized suffix, GCC就认为他们是目标文件或库文件. (根据文件内容,连接器能够区分目标文件和库文件).如果GCC执行连接操作,这些目标文件将成为连接器的输入文件.-llibrary连接名为library的库文件.连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a’.连接器会当做文件名得到准确说明一样引用这个文件.搜索目录除了一些系统标准目录外,还包括用户以`-L’选项指定的路径.一般说来用这个方法找到的文件是库文件---即由目标文件组成的归档文件(archive file).连接器处理归档文件的方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没有被定义.但是,如果连接器找到普通的目标文件,而不是库文件,就把这个目标文件按平常方式连接进来.指定`-l’选项和指定文件名的唯一区别是, `-l选项用`lib’和`.a’把library包裹起来,而且搜索一些目录.-lobjc这个-l选项的特殊形式用于连接Objective C程序.-nostartfiles不连接系统标准启动文件,而标准库文件仍然正常使用.-nostdlib不连接系统标准启动文件和标准库文件.只把指定的文件传递给连接器.-static在支持动态连接(dynamic linking)的系统上,阻止连接共享库.该选项在其他系统上无效.-shared生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件.只有部分系统支持该选项.-symbolic建立共享目标文件的时候,把引用绑定到全局符号上.对所有无法解析的引用作出警告(除非用连接编辑选项 `-Xlinker -z -Xlinker defs’取代).只有部分系统支持该选项.-Xlinker option把选项option传递给连接器.可以用他传递系统特定的连接选项, GNU CC无法识别这些选项.如果需要传递携带参数的选项,你必须使用两次`-Xlinker’,一次传递选项,另一次传递他的参数. 例如,如果传递`-assert definitions’,你必须写成`-Xlinker -assert -Xlinker definitions’,而不能写成`-Xlinker "-assert definitions"’,因为这样会把整个字符串当做一个参数传递,显然这不是连接器期待的.-Wl,option把选项option传递给连接器.如果option中含有逗号,就在逗号处分割成多个选项.-u symbol使连接器认为取消了symbol的符号定义,从而连接库模块以取得定义.你可以使用多个 `-u’选项,各自跟上不同的符号,使得连接器调入附加的库模块.目录选项(DIRECTORY OPTION)下列选项指定搜索路径,用于查找头文件,库文件,或编译器的某些成员:-Idir在头文件的搜索路径列表中添加dir 目录.-I-任何在`-I-’前面用`-I’选项指定的搜索路径只适用于`#include "file"’这种情况;他们不能用来搜索`#include <file>’包含的头文件.如果用`-I’选项指定的搜索路径位于`-I-’选项后面,就可以在这些路径中搜索所有的 `#include’指令. (一般说来-I选项就是这么用的.)还有, `-I-’选项能够阻止当前目录(存放当前输入文件的地方)成为搜索`#include "file"’的第一选择.没有办法克服`-I-’选项的这个效应.你可以指定 `-I.’搜索那个目录,它在调用编译器时是当前目录.这和预处理器的默认行为不完全一样,但是结果通常令人满意.`-I-’不影响使用系统标准目录,因此, `-I-’和`-nostdinc’是不同的选项.-Ldir在`-l’选项的搜索路径列表中添加dir目录.-Bprefix这个选项指出在何处寻找可执行文件,库文件,以及编译器自己的数据文件.编译器驱动程序需要执行某些下面的子程序: `cpp’, `cc1’ (或C++的 `cc1plus’), `as’和`ld’.他把prefix当作欲执行的程序的前缀,既可以包括也可以不包括`machine/version/’.对于要运行的子程序,编译器驱动程序首先试着加上`-B’前缀(如果存在).如果没有找到文件,或没有指定 `-B’选项,编译器接着会试验两个标准前缀`/usr/lib/gcc/’和 `/usr/local/lib/gcc-lib/’.如果仍然没能够找到所需文件,编译器就在`PATH’环境变量指定的路径中寻找没加任何前缀的文件名.如果有需要,运行时(run-time)支持文件`libgcc.a’也在`-B’前缀的搜索范围之内. 如果这里没有找到,就在上面提到的两个标准前缀中寻找,仅此而已.如果上述方法没有找到这个文件,就不连接他了.多数情况的多数机器上, `libgcc.a’并非必不可少.你可以通过环境变量GCC_EXEC_PREFIX获得近似的效果;如果定义了这个变量,其值就和上面说的一样用做前缀.如果同时指定了`-B’选项和GCC_EXEC_PREFIX变量,编译器首先使用 `-B’选项,然后才尝试环境变量值.警告选项(WARNING OPTION)警告是针对程序结构的诊断信息,程序不一定有错误,而是存在风险,或者可能存在错误.下列选项控制GNU CC产生的警告的数量和类型:-fsyntax-only检查程序中的语法错误,但是不产生输出信息.-w禁止所有警告信息.-Wno-import禁止所有关于#import的警告信息.-pedantic打开完全服从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序.无论有没有这个选项,符合ANSI C标准的程序应该能够被正确编译(虽然极少数程序需要`-ansi’ 选项).然而,如果没有这个选项,某些GNU扩展和传统C特性也得到支持.使用这个选项可以拒绝这些程序.没有理由使用这个选项,他存在只是为了满足一些书呆子(pedant).对于替选关键字(他们以`__’开始和结束) `-pedantic’不会产生警告信息. Pedantic 也不警告跟在__extension__后面的表达式.不过只应该在系统头文件中使用这种转义措施,应用程序最好避免.-pedantic-errors该选项和`-pedantic’类似,但是显示错误而不是警告.-W对下列事件显示额外的警告信息:*非易变自动变量(nonvolatile automatic variable)可能在调用longjmp时发生改变. 这些警告仅在优化编译时发生.编译器只知道对setjmp的调用,他不可能知道会在哪里调用longjmp,事实上一个信号处理例程可以在程序的任何地点调用他.其结果是,即使程序没有问题,你也可能会得到警告,因为无法在可能出现问题的地方调用longjmp.*既可以返回值,也可以不返回值的函数. (缺少结尾的函数体被看作不返回函数值)例如,下面的函数将导致这种警告:foo (a){if (a > 0)return a;}由于GNU CC不知道某些函数永不返回(含有abort和longjmp),因此有可能出现虚假警告.*表达式语句或逗号表达式的左侧没有产生作用(side effect).如果要防止这种警告,应该把未使用的表达式强制转换为void类型.例如,这样的表达式`x[i,j]’会导致警告,而`x[(void)i,j]’就不会.*无符号数用`>’或`<=’和零做比较.-Wimplicit-int警告没有指定类型的声明.-Wimplicit-function-declaration警告在声明之前就使用的函数.-Wimplicit同-Wimplicit-int和-Wimplicit-function-declaration.-Wmain如果把main函数声明或定义成奇怪的类型,编译器就发出警告.典型情况下,这个函数用于外部连接, 返回int数值,不需要参数,或指定两个参数.-Wreturn-type如果函数定义了返回类型,而默认类型是int型,编译器就发出警告.同时警告那些不带返回值的 return语句,如果他们所属的函数并非void类型.-Wunused如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某条语句的运算结果显然没有使用, 编译器就发出警告.-Wswitch如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,编译器就发出警告. ( default语句的出现能够防止这个警告.)超出枚举范围的case语句同样会导致这个警告.-Wcomment如果注释起始序列`/*’出现在注释中,编译器就发出警告.。

GNU Make 中文手册v3.8 学习

GNU Make 中文手册v3.8 学习

∙这个手册翻译整理: 徐海兵, 先表示一些尊敬. “本人在工作之余,花了18个多月时间完成对“info make”的翻译整理,完成这个中文版手册”, 工夫不负有心人.∙链接器将.o文件中使用的函数和其它.o或者库文件中的相关符号进行合并,对所有文件中的符号进行重新安排(重定位),并链接系统相关文件(程序启动文件等)最终生成可执行程序。

∙Linux中,共享库文件格式通常为“ELF”格式。

共享库已经具备了可执行条件。

∙模块中各个成员的地址(变量引用和函数调用)都是相对地址。

使用此共享库的程序在运行时,共享库被动态加载到内存并和主程序在内存中进行连接。

多个可执行程序可共享库文件的代码段(多个程序可以共享的使用库中的某一个模块,共享代码,不共享数据)。

另外共享库的成员对象可被执行(由libdl.so提供支持)。

∙在make读取Makefile以后会建立一个编译过程的描述数据库。

此数据库中记录了所有各个文件之间的相互关系,以及它们的关系描述(要是我能"看"到这个数据库,就能使用程序trace,你知道一个大型的project 的makefile有多复杂)∙当使用make工具进行编译时,工程中以下几种文件在执行make时将会被编译(重新编译):1. 所有的源文件没有被编译过,则对各个C源文件进行编译并进行链接,生成最后的可执行程序;2. 每一个在上次执行make之后修改过的C源代码文件在本次执行make时将会被重新编译;3. 头文件在上一次执行make之后被修改。

则所有包含此头文件的C源文件在本次执行make时将会被重新编译。

(这就是为什么头文件修改后,很多文件都会被重新compile的原因)∙首先书写时,可以将一个较长行使用反斜线(\)来分解为多行,这样可以使我们的Makefile书写清晰、容易阅读理解。

但需要注意:反斜线之后不能有空格(这也是大家最容易犯的错误,错误比较隐蔽)∙编译.c源文件规则的命令可以不用明确给出。

makefile基础教程-GNUmake介绍

makefile基础教程-GNUmake介绍

第二章:GNU make 介绍make在执行时,需要一个命名为Makefile的文件。

这个文件告诉make以何种方式编译源代码和链接程序。

典型地,可执行文件可由一些.o文件按照一定的顺序生成或者更新。

如果在你的工程中已经存在一个活着多个正确的Makefile。

当对工程中的若干源文件修改以后,需要根据修改来更新可执行文件或者库文件,正如前面提到的你只需要在shell下执行“make”。

make会自动根据修改情况完成源文件的对应.o文件的更新、库文件的更新、最终的可执行程序的更新。

make通过比较对应文件(规则的目标和依赖,)的最后修改时间,来决定哪些文件需要更新、那些文件不需要更新。

对需要更新的文件make就执行数据库中所记录的相应命令(在make读取Makefile以后会建立一个编译过程的描述数据库。

此数据库中记录了所有各个文件之间的相互关系,以及它们的关系描述)来重建它,对于不需要重建的文件make什么也不做。

而且可以通过make的命令行选项来指定需要重新编译的文件。

Problems and Bugs=================If you have problems with GNU `make' or think you've found a bug, please report it to the developers; we cannot promise to do anything but we might well want to fix it.Before reporting a bug, make sure you've actually found a real bug.Carefully reread the documentation and see if it really says you can do what you're trying to do. If it's not clear whether you should be able to do something or not, report that too; it's a bug in the documentation!Before reporting a bug or trying to fix it yourself, try to isolate it to the smallest possible makefile that reproduces the problem. Then send us the makefile and the exact results `make' gave you, including any error or warning messages. Please don't paraphrase these messages: it's best to cut and paste them into your report. When generating this small makefile, be sure to not use any non-free or unusual tools in your commands: you can almost always emulate what such a tool would do with simple shell commands. Finally, be sure to explain what you expected to occur; this will help us decide whether the problem was really in the documentation.Once you have a precise problem you can report it in one of two ways.Either send electronic mail to:bug-make@or use our Web-based project management tool, at:/projects/make/In addition to the information above, please be careful to include the version number of `make' you are using. You can get this information with the command `make --version'. Be sure also to include the type of machine and operating system you are using. One way to obtain this information is by looking at the final lines of output from the command`make --help'.以上时GNU make的bug反馈方式。

GNU-Make-使用手册(中译版)

GNU-Make-使用手册(中译版)

GNU Make 使用手册(中译版)翻译:于凤昌译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构、理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件.目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的Makefile文件,因此本人认真阅读了GNU Make 使用手册(3。

79)版原文,在此基础上翻译了该手册,以满足对Linux源代码有兴趣或者希望采用GCC编写程序但对缺乏GNU Make全面了解之人士的需要。

本人是业余爱好不是专业翻译人士,如果有问题请通过电子信箱与我联系共同商讨,本人的E—mail为:yfc70@public2。

注意在文章中出现的斜体加粗字表示章节。

GNU make Version 3。

79April 2000Richard M。

Stallman and Roland McGrath目录1 make概述1.1 怎样阅读本手册1.2 问题和BUG2 Makefile文件介绍2。

1 规则的格式2。

2一个简单的Makefile文件2.3make处理Makefile文件的过程2。

4使用变量简化Makefile文件2。

5让make推断命令2。

6另一种风格的Makefile文件2。

7在目录中删除文件的规则33编写Makefile文件3.1Makefile文件的内容3.2Makefile文件的命名3。

3包含其它的Makefile文件3。

4变量MAKEFILES3.5Makefile文件重新生成的过程3.6重载其它Makefile文件3。

7make读取Makefile文件的过程4 编写规则4。

1规则的语法4。

2在文件名中使用通配符4。

2.1通配符例子4。

2。

2使用通配符的常见错误4.2.3函数wildcard4.3在目录中搜寻依赖4。

3.1VPATH:所有依赖的搜寻路径4.3.2vpath指令4。

3。

3目录搜寻过程4。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

GNU Make 使用手册(中译版)翻译:于凤昌译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构、理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件。

目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的Makefile文件,因此本人认真阅读了GNU Make 使用手册(3.79)版原文,在此基础上翻译了该手册,以满足对Linux源代码有兴趣或者希望采用GCC编写程序但对缺乏GNU Make全面了解之人士的需要。

本人是业余爱好不是专业翻译人士,如果有问题请通过电子信箱与我联系共同商讨,本人的E-mail为:yfc70@ 。

注意在文章中出现的斜体加粗字表示章节。

GNU make Version 3.79April 2000Richard M. Stallman and Roland McGrath目录1 make概述1.1 怎样阅读本手册1.2 问题和BUG2 Makefile文件介绍2.1 规则的格式2.2一个简单的Makefile文件2.3make处理Makefile文件的过程2.4使用变量简化Makefile文件2.5让make推断命令2.6另一种风格的Makefile文件2.7在目录中删除文件的规则33编写Makefile文件3.1Makefile文件的内容3.2Makefile文件的命名3.3包含其它的Makefile文件3.4变量MAKEFILES3.5Makefile文件重新生成的过程3.6重载其它Makefile文件3.7make读取Makefile文件的过程4 编写规则4.1规则的语法4.2在文件名中使用通配符4.2.1通配符例子4.2.2使用通配符的常见错误4.2.3函数wildcard4.3在目录中搜寻依赖4.3.1VPATH:所有依赖的搜寻路径4.3.2vpath指令4.3.3目录搜寻过程4.3.4编写搜寻目录的shell命令4.3.5目录搜寻和隐含规则4.3.6连接库的搜寻目录4.4假想目标4.5没有命令或依赖的规则4.6使用空目录文件记录事件4.7内建的特殊目标名4.8具有多个目标的规则4.9具有多条规则的目标4.10静态格式规则4.10.1静态格式规则的语法4.10.2静态格式规则和隐含规则4.11双冒号规则4.12自动生成依赖5 在规则中使用命令5.1命令回显5.2执行命令5.3并行执行5.4命令错误5.5中断或关闭make5.6递归调用make5.6.1变量MAKE的工作方式5.6.2与子make通讯的变量5.6.3与子make通讯的选项5.6.4`--print-directory'选项5.7定义固定次序命令5.8使用空命令66使用变量6.1变量引用基础6.2变量的两个特色6.3变量高级引用技术6.3.1替换引用6.3.2嵌套变量引用6.4变量取值6.5设置变量6.6为变量值追加文本6.7override指令6.8定义多行变量6.9环境变量6.10特定目标变量的值6.11特定格式变量的值7 Makefile文件的条件语句7.1条件语句的例子7.2条件语句的语法7.3测试标志的条件语句8 文本转换函数8.1函数调用语法8.2字符串替换和分析函数8.3文件名函数8.4函数foreach8.5函数if8.6函数call8.7函数origin8.8函数shell8.9控制Make的函数99运行make9.1指定Makefile文件的参数9.2指定最终目标的参数9.3代替执行命令9.4避免重新编译文件9.5变量重载9.6测试编译程序9.7选项概要10 使用隐含规则10.1使用隐含规则10.2隐含规则目录10.3隐含规则使用的变量10.4隐含规则链10.5定义与重新定义格式规则10.5.1格式规则简介10.5.2格式规则的例子10.5.3自动变量10.5.4格式匹配10.5.5万用规则10.5.6删除隐含规则10.6定义最新类型的缺省规则10.7过时的后缀规则10.8隐含规则搜寻算法11 使用make更新档案文件11.1档案成员目标11.2档案成员目标的隐含规则11.2.1更新档案成员的符号索引表11.3使用档案的危险11.4档案文件的后缀规则12 GNU make的特点13 不兼容性和失去的特点14 Makefile文件惯例14.1makefile文件的通用惯例14.2makefile文件的工具14.3指定命令的变量14.4安装路径变量14.5用户标准目标14.6安装命令分类15快速参考16make产生的错误17复杂的Makefile文件例子附录 名词翻译对照表1 Make 概述Make 可自动决定一个大程序中哪些文件需要重新编译,并发布重新编译它们的命令。

本版本GNU Make使用手册由Richard M. Stallman and Roland McGrath编著,是从Paul D. Smith撰写的V3.76版本发展过来的。

GNU Make符合IEEE Standard 1003.2-1992 (POSIX.2) 6.2章节的规定。

因为C语言程序更具有代表性,所以我们的例子基于C语言程序,但Make并不是仅仅能够处理C语言程序,它可以处理那些编译器能够在Shell命令下运行的的各种语言的程序。

事实上,GNU Make不仅仅限于程序,它可以适用于任何如果一些文件变化导致另外一些文件必须更新的任务。

如果要使用Make,必须先写一个称为Makefile的文件,该文件描述程序中各个文件之间的相互关系,并且提供每一个文件的更新命令。

在一个程序中,可执行程序文件的更新依靠OBJ文件,而OBJ文件是由源文件编译得来的。

一旦合适的Makefile文件存在,每次更改一些源文件,在shell命令下简单的键入: make就能执行所有的必要的重新编译任务。

Make程序根据Makefile文件中的数据和每个文件更改的时间戳决定哪些文件需要更新。

对于这些需要更新的文件,Make基于Makefile文件发布命令进行更新,进行更新的方式由提供的命令行参数控制。

具体操作请看运行Make章节。

1.1怎样阅读本手册如果您现在对Make一无所知或者您仅需要了解对make 的普通性介绍,请查阅前几章内容,略过后面的章节。

前几章节是普通介绍性内容,后面的章节是具体的专业、技术内容。

如果您对其它Make程序十分熟悉,请参阅GNU Make的特点和不兼容性和失去的特点部分,GNU Make的特点这一章列出了GNU Make对make程序的扩展,不兼容和失去的特点一章解释了其它Make程序有的特征而GNU Make缺乏的原因。

对于快速浏览者,请参阅选项概要、快速参考和内建的特殊目标名部分。

1.2问题和BUG如果您有关于GNU Make的问题或者您认为您发现了一个BUG,请向开发者报告;我们不能许诺我们能干什么,但我们会尽力修正它。

在报告BUG之前,请确定您是否真正发现了BUG,仔细研究文档后确认它是否真的按您的指令运行。

如果文档不能清楚的告诉您怎么做,也要报告它,这是文档的一个BUG。

在您报告或者自己亲自修正BUG之前,请把它分离出来,即在使问题暴露的前提下尽可能的缩小Makefile文件。

然后把这个Makefile文件和Make给出的精确结果发给我们。

同时请说明您希望得到什么,这可以帮助我们确定问题是否出在文档上。

一旦您找到一个精确的问题,请给我们发E-mail,我们的E-mail地址是:bug-make@在邮件中请包含您使用的GNU Make的版本号。

您可以利用命令‘make--version’得到版本号。

同时希望您提供您的机器型号和操作系统类型,如有可能的话,希望同时提供config.h文件(该文件有配置过程产生)。

2 Makefile文件介绍Make程序需要一个所谓的Makefile文件来告诉它干什么。

在大多数情况下,Makefile 文件告诉Make怎样编译和连接成一个程序。

本章我们将讨论一个简单的Makefile文件,该文件描述怎样将8个C源程序文件和3个头文件编译和连接成为一个文本编辑器。

Makefile文件可以同时告诉Make怎样运行所需要的杂乱无章的命令(例如,清除操作时删除特定的文件)。

如果要看更详细、复杂的Makefile文件例子,请参阅复杂的Makefile文件例子一章。

当Make重新编译这个编辑器时,所有改动的C语言源文件必须重新编译。

如果一个头文件改变,每一个包含该头文件的C语言源文件必须重新编译,这样才能保证生成的编辑器是所有源文件更新后的编辑器。

每一个C语言源文件编译后产生一个对应的OBJ文件,如果一个源文件重新编译,所有的OBJ文件无论是刚刚编译得到的或原来编译得到的必须从新连接,形成一个新的可执行文件。

2.1 规则的格式一个简单的Makefile文件包含一系列的“规则”,其样式如下:目标(target)…: 依赖(prerequiries)…<tab>命令(command)……目标(target)通常是要产生的文件的名称,目标的例子是可执行文件或OBJ文件。

目标也可是一个执行的动作名称,诸如‘clean’(详细内容请参阅假想目标一节)。

依赖是用来输入从而产生目标的文件,一个目标经常有几个依赖。

命令是Make执行的动作,一个规则可以含有几个命令,每个命令占一行。

注意:每个命令行前面必须是一个Tab字符,即命令行第一个字符是Tab。

这是不小心容易出错的地方。

通常,如果一个依赖发生变化,则需要规则调用命令对相应依赖和服务进行处理从而更新或创建目标。

但是,指定命令更新目标的规则并不都需要依赖,例如,包含和目标‘clern’相联系的删除命令的规则就没有依赖。

规则一般是用于解释怎样和何时重建特定文件的,这些特定文件是这个详尽规则的目标。

Make需首先调用命令对依赖进行处理,进而才能创建或更新目标。

当然,一个规则也可以是用于解释怎样和何时执行一个动作,详见编写规则一章。

一个Makefile文件可以包含规则以外的其它文本,但一个简单的Makefile文件仅仅需要包含规则。

虽然真正的规则比这里展示的例子复杂,但格式却是完全一样。

2.2一个简单的Makefile文件一个简单的Makefile文件,该文件描述了一个称为文本编辑器(edit)的可执行文件生成方法,该文件依靠8个OBJ文件(.o文件),它们又依靠8个C源程序文件和3个头文件。

在这个例子中,所有的C语言源文件都包含‘defs.h’ 头文件,但仅仅定义编辑命令的源文件包含‘command.h’头文件,仅仅改变编辑器缓冲区的低层文件包含‘buffer.h’头文件。

edit : main.o kbd.o command.o display.o \insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.h buffer.hcc -c display.cinsert.o : insert.c defs.h buffer.hcc -c insert.csearch.o : search.c defs.h buffer.hcc -c search.cfiles.o : files.c defs.h buffer.h command.hcc -c files.cutils.o : utils.c defs.hcc -c utils.cclean :rm edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.o我们把每一个长行使用反斜杠-新行法分裂为两行或多行,实际上它们相当于一行,这样做的意图仅仅是为了阅读方便。

相关文档
最新文档