Makefile详解——从入门到精通 Makefile是软件构建过程中的一个重要工具,它定义了项目的构建规则、目标和依赖关系,使得编译和链接过程能够自动化进行。掌握Makefile的编写和使用对于任何编程人员,尤其是嵌入式系统开发者来说都是必不可少的技能。 1. **make命令** `make`命令是执行Makefile的关键,它根据Makefile中的指令来决定哪些文件需要重新编译。`make -h`或`make --help`可以显示帮助信息,提供各种选项以控制make的行为。 2. **make命令选项** - `-f`或`--file`指定要使用的Makefile文件名。 - `-C`或`--directory`改变工作目录。 - `-d`打印调试信息,帮助理解make的执行过程。 - `-j`或`--jobs`允许同时运行的进程数量,用于并发编译提高效率。 - `-i`或`--ignore-errors`忽略命令执行时的错误,继续执行其他命令。 - `-k`或`--keep-going`即使有目标无法制作,也继续尝试其他目标。 - `-n`或`--just-print`仅打印命令而不执行,用于预览构建过程。 - `-q`或`--question`检查目标是否是最新的,如果需要更新则不显示任何输出。 3. **Makefile的基本结构** Makefile通常包含目标(target)、依赖(dependency)和命令(recipe)。目标是需要创建或更新的文件,依赖是目标生成所依赖的文件,命令则是执行的编译或链接操作。 4. **规则和依赖关系** 在Makefile中,规则通常以目标开始,接着是依赖项,然后是一行或多行命令。当依赖文件更新后,make会自动执行相应的命令来更新目标。 5. **变量和函数** Makefile支持变量的定义和使用,可以简化规则的编写。例如,可以定义`CC`变量为编译器,`CFLAGS`为编译选项。此外,还有内置函数如`$(wildcard)`用来查找所有匹配的文件,`$(patsubst)`进行字符串替换等。 6. **隐含规则** make内建了一些隐含规则,如C/C++源文件自动编译为对象文件,然后链接成可执行文件。不过,如果需要自定义构建流程,可以覆盖这些隐含规则。 7. **模式规则** 模式规则允许用通配符`%`来定义一组相关的规则,比如`%.o:%.c`表示所有`.c`文件编译为`.o`文件的规则。 8. **条件语句和函数** Makefile还支持条件语句,如`ifeq`, `ifneq`等,以及函数如`$(shell)`执行系统命令,`$(call)`调用用户定义的函数等,增加Makefile的灵活性。 9. **清理目标** 通常,Makefile会包含一个`clean`目标,用于清理编译过程中产生的临时文件和目标文件。 10. **多Makefile管理** 大项目可能需要多个Makefile,可以通过`include`指令包含其他Makefile,或者使用`-f`选项指定多个Makefile。 Makefile是构建和管理软件项目不可或缺的工具,理解和熟练使用Makefile能提高开发效率,减少手动编译的繁琐。通过深入学习和实践,你可以编写出高效且易于维护的Makefile,更好地适应各种项目需求。
2024-08-26 17:05:26 1.01MB 文档资料 MakeFile
1
Makefile详解(超级好),详细解释了Makefile的用法,说的非常通透简明。
2022-09-22 12:12:38 982KB Makefile
1
Makefile详解 && Makefile中文文档,参考https://blog.csdn.net/liuxingyuzaixian/article/details/125871421
2022-07-19 18:04:05 1.81MB Makefile Makefile详解 Makefile中文文档
1
Linux&Unix环境下的make和makefile详解 (文章来自cu 原作者xzh2002).doc
2022-05-25 12:00:51 85KB unix
Linux&Unix环境下的make和makefile详解 (文章来自cu 原作者xzh2002)new.doc
2022-05-25 12:00:51 579KB unix
Make命令   在make命令后不仅可以出现宏定义,还可以跟其他命令行参数,这些参数指定了需要编译的目标文件。其标准形式为:   target1 [target2 …]:[:][dependent1 …][;commands][#…]   [(tab) commands][#…]   方括号中间的部分表示可选项。Targets和dependents当中可以包含字符、数字、句点和"/"符号。除了引用,commands中不能含有"#",也不允许换行。   在通常的情况下命令行参数中只含有一个冒号":",此时command序列通常和makefile文件中某些定义文件间依赖关系的描述行有关。如果与目标相关连的那些描述行指定了相关的command序列,那么就执行这些相关的command命令,即使在分号和(tab)后面的aommand字段甚至有可能是NULL。如果那些与目标相关连的行没有指定command,那么将调用系统默认的目标文件生成规则。   如果命令行参数中含有两个冒号"::",则此时的command序列也许会和makefile中所有描述文件依赖关系的行有关。此时将执行那些与目标相关连的描述行所指向的相关命令。同时还将执行build-in规则。   如果在执行command命令时返回了一个非"0"的出错信号,例如makefile文件中出现了错误的目标文件名或者出现了以连字符打头的命令字符串,make操作一般会就此终止,但如果make后带有"-i"参数,则make将忽略此类出错信号。   Make命本身可带有四种参数:标志、宏定义、描述文件名和目标文件名。其标准形式为:   Make [flags] [macro definitions] [targets]   Unix系统下标志位flags选项及其含义为:   -f file  指定file文件为描述文件,如果file参数为"-"符,那么描述文件指向标准输入。如果没有"-f"参数,则系统将默认当前目录下名为makefile或者名为Makefile的文件为描述文件。在linux中, GNU make 工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索 makefile文件。   -i   忽略命令执行返回的出错信息。   -s   沉默模式,在执行之前不输出相应的命令行信息。   -r   禁止使用build-in规则。   -n   非执行模式,输出所有执行命令,但并不执行。   -t   更新目标文件。   -q   make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息。   -p   输出所有宏定义和目标文件描述。   -d   Debug模式,输出有关文件和检测时间的详细信息。   linux下make标志位的常用选项与Unix系统中稍有不同,下面我们只列出了不同部分:   -c dir   在读取 makefile 之前改变到指定的目录dir。   -I dir   当包含其他 makefile文件时,利用该选项指定搜索目录。   -h   help文挡,显示所有的make选项。   -w   在处理 makefile 之前和之后,都显示工作目录。   通过命令行参数中的target ,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件。
2022-02-01 22:08:54 191KB make Makefile 详解 一起写Makefile
1
makefile 初学者入门资料
2021-10-21 20:01:50 887KB 文档
1
万能makefile写法详解,一步一步写一个实用的makefile,详解 sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' $@; \-附件资源
2021-09-13 20:39:24 106B
1
U-BOOT中MAKEFILE详解.doc
2021-08-03 09:05:28 16KB uboot
1
makefile 精炼到位的讲解,非常适合快速入门
2021-05-10 16:45:54 982KB makefile
1