![](https://img-blog.csdnimg.cn/direct/f600dd8ba113477bb11c7b1f2fd9cd62.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
一起学习Makefile
文章平均质量分 82
什么是 makefile?或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows的 IDE 都为你做了这个工作,但我觉得要作一个好的和 professional 的程序员,makefile还是要懂。跟我一起写Makefile,come on!!!!
普通网友
这个作者很懒,什么都没留下…
展开
-
第十二部分 使用 make 更新函数库文件
函数库文件也就是对 Object 文件(程序编译的中间文件)的打包文件。在 Unix 下,一 般是由命令"ar"来完成打包工作。原创 2024-01-20 17:24:06 · 339 阅读 · 0 评论 -
第十一部分 隐含规则(四)
如果目标是"archive(member)"的函数库文件模式,那么这个算法会被运行两次,第一 次是找目标 T,如果没有找到的话,那么进入第二次,第二次会把"member"当作 T 来搜索。后缀规则中所定义的后缀应该是 make 所认识的,如果一个后缀是 make 所认识的,那么 这个规则就是单后缀规则,而如果两个连在一起的后缀都被 make 所认识,那就是双后缀规 则。因而,如果你定义了一个规则是".c.o"那么其就 是双后缀规则,意义就是".c"是源文件的后缀,".o"是目标文件的后缀。原创 2024-01-18 05:30:00 · 923 阅读 · 0 评论 -
第十一部分 隐含规则(三)
你可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则,只是 在规则中,目标的定义需要有"%"字符。"%"的意思是表示一个或多个任意字符。在依赖目标 中同样可以使用"%",只是依赖目标中的"%"的取值,取决于其目标。有一点需要注意的是,"%"的展开发生在变量和函数的展开之后,变量和函数的展开发 生在 make 载入 Makefile 时,而模式规则中的"%"则发生在运行时。模式规则中,至少在规则的目标定义中要包含"%",否则,就是一般的规则。原创 2024-01-18 05:00:00 · 808 阅读 · 0 评论 -
第十一部分 隐含规则(二)
如,从文件“foo.c”生成目标 程序“foo”,按道理,make 会编译生成中间文件“foo.o”,然后链接成“foo”,但在实 际情况下,这一动作可以被一条“cc”的命令完成(cc –o foo foo.c),于是优化过的规 则就不会生成中间文件。在上面的例子中,如果文件[.c]存在,那么就直接调用 C 的编译器的隐含规则,如果没 有[.c]文件,但有一个[.y]文件,那么 Yacc 的隐含规则会被调用,生成[.c]文件,然后, 再调用 C 编译的隐含规则最终由[.c]生成[.o]文件,达到目标。原创 2024-01-17 05:30:00 · 1574 阅读 · 0 评论 -
第十一部分 隐含规则 (一)
在我们使用 Makefile 时,有一些我们会经常使用,而且使用频率非常高的东西,比如, 我们编译 C/C++的源程序为中间目标文件(Unix 下是[.o]文件,Windows 下是[.obj]文件)。本章讲述的就是一些在 Makefile 中的“隐含的”,早先约定了的,不需要我们再写出来的 规则。“隐含规则”也就是一种惯例,make 会按照这种“惯例”心照不喧地来运行,那怕我 们的 Makefile 中没有书写这样的规则。原创 2024-01-17 05:00:00 · 1677 阅读 · 0 评论 -
第十部分 make 的运行
一般来说,最简单的就是直接在命令行下输入 make 命令,make 命令会找当前目录的 makefile 来执行,一切都是自动的。但也有时你也许只想让 make 重编译某些文件,而不是 整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。本 章节就是讲述如何使用 make 命令的。原创 2024-01-16 05:30:00 · 1234 阅读 · 0 评论 -
第九部分 使用函数 (五)
这些信息对于我们编写 Makefile 是非常有用的,例如,假设我们有一个 Makefile 其包 了一个定义文件 Make.def,在 Make.def 中定义了一个变量“bletch”,而我们的环境中也 有一个环境变量“bletch”,此时,我们想判断一下,如果变量来源于环境,那么我们就把 之重定义了,如果来源于 Make.def 或是命令行等非环境的,那么我们就不重新定义它。注意,是变量的名字,不应该是引用。origin 函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪 里来的?原创 2024-01-16 05:00:00 · 1041 阅读 · 0 评论 -
第九部分 使用函数 (四)
foreach 函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile 中的 foreach 函数几乎是仿照于 Unix 标准 Shell(/bin/sh)中的 for 语句,或是 C-Shell (/bin/csh)中的 foreach 语句而构建的。这个函数的意思是,把参数中的单词逐一取出放到参数所指定的变量中, 然后再执行所包含的表达式。原创 2024-01-15 05:30:00 · 933 阅读 · 0 评论 -
第九部分 使用函数 (三)
示例:$(basename src/foo.c src-1.0/bar.c hacks)返回值是“src/foo src-1.0/b ar hacks”。如果的单词个数要比 的多,那么,中的多出来的单词将保持原样。示例:$(suffix src/foo.c src-1.0/bar.c hacks)返回值是“.c .c”。示例:$(addprefix src/,foo bar)返回值是“src/foo src/bar”。示例: $(dir src/foo.c hacks)返回值是“src/ ./”。原创 2024-01-15 05:00:00 · 815 阅读 · 0 评论 -
第九部分 使用函数 (二)
如 果 我 们 的 “$(VPATH)” 值 是 “src:../headers” , 那 么 “$(patsubst %,-I%,$(subst :, ,$(VPATH)))”将返回“-Isrc -I../headers”,这正是 cc 或 gcc 搜索 头文件路径的参数。那么,“$(objects:.o=.c)”和“$(patsubst %.o,%.c,$(objects))”是一样的。把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”原创 2024-01-14 19:56:02 · 958 阅读 · 0 评论 -
第九部分 使用函数 (一)
在 Makefile 中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具 有智能。make 所支持的函数也不算很多,不过已经足够我们的操作了。函数调用后,函数 的返回值可以当做变量来使用。原创 2024-01-14 19:07:11 · 411 阅读 · 0 评论 -
第八部分 使用条件判断
使用条件判断,可以让 make 根据运行时的不同情况选择不同的执行分支。条件表达式 可以是比较变量的值,或是比较变量和常量的值。原创 2024-01-07 12:38:11 · 1013 阅读 · 0 评论 -
第七部分 使用变量 (下)
这里介绍两种变量的高级使用方法,第一种是变量值的替换。我们可以替换变量中的共有的 部分,其格式是“$(var:a=b)”或是“${var:a=b}”,其意思是,把变量“var”中所有以 “a”字串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束 符”。还是看一个示例吧:这个示例中,我们先定义了一个“$(foo)”变量,而第二行的意思是把“$(foo)”中所 有以“.o”字串“结尾”全部替换成“.c”,所以我们的“$(bar)”的值就是“a.c b.c c.c”。原创 2024-01-07 12:20:30 · 882 阅读 · 0 评论 -
第七部分 使用变量 (上)
在 Makefile 中的定义的变量,就像是 C/C++语言中的宏一样,他代表了一个文本字串, 在 Makefile 中执行的时候其会自动原模原样地展开在所使用的地方。其与 C/C++所不同的 是,你可以在 Makefile 中改变其值。在 Makefile 中,变量可以使用在“目标”,“依赖目 标”,“命令”或是 Makefile 的其它部分中。变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)。原创 2024-01-06 17:07:15 · 890 阅读 · 0 评论 -
六、书写命令
如果 Makefile 中出现一些相同命令序列,那么我们可以为这些相同的命令序列定义一 个变量。定义这种命令序列的语法以“define”开始,以“endef”结束,如:endef这里,“run-yacc”是这个命令包的名字,其不要和 Makefile 中的变量重名。在 “define”和“endef”中的两行就是命令序列。这个命令包中的第一个命令是运行 Yacc 程序,因为 Yacc 程序总是生成“y.tab.c”的文件,所以第二行的命令就是把这个文件改改 名字。还是把这个命令包放到一个示例中来看看吧。原创 2024-01-06 13:30:52 · 937 阅读 · 0 评论 -
五、书写规则
规则包含两个部分,一个是依赖关系,一个是生成目标的方法。在 Makefile 中,规则的顺序是很重要的,因为,Makefile 中只应该有一个最终目标, 其它的目标都是被这个目标所连带出来的,所以一定要让 make 知道你的最终目标是什么。一般来说,定义在 Makefile 中的目标可能会有很多,但是第一条规则中的目标将被确立为 最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make 所完成的也就是这个目标。好了,还是让我们来看一看如何书写规则。原创 2024-01-05 23:01:11 · 1095 阅读 · 0 评论 -
四、Makefile总述
在 Makefile 中我们要定义一系列的变量,变量一般都是字符串,这个有点你 C 语言中 的宏,当 Makefile 被执行时,其中的变量都会被扩展到相应的引用位置上。原创 2024-01-05 22:24:29 · 1329 阅读 · 0 评论 -
三、Makefile 介绍
make 命令执行时,需要一个 Makefile 文件,以告诉 make 命令需要怎么样的去编译和 链接程序。首先,我们用一个示例来说明 Makefile 的书写规则。以便给大家一个感兴认识。这个 示例来源于 GNU 的 make 使用手册,在这个示例中,我们的工程有 8 个 C 文件,和 3 个头文 件,我们要写一个 Makefile 来告诉 make 命令如何编译和链接这几个文件。我们的规则是: 1)如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。原创 2022-08-21 21:52:03 · 292 阅读 · 0 评论 -
二、程序的编译和链接
链接器并不管函数所在的源文件,只管函数的中间目标文件 (Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件 打个包,在 Windows 下这种包叫“库文件”(Library File),也就是 .lib 文件,在 UNIX 下,是 Archive File,也就是 .a 文件。编译时,编译器需要的是语法的正确,函数与变量的 声明的正确。原创 2022-08-21 21:44:47 · 138 阅读 · 0 评论 -
一起Makefile
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile 就像一个Shell 脚本一样,其中也可以执行操作系统的命令。make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如:Delphi 的 make,Visual C++的 nmake,Linux 下 GNU 的 make。原创 2022-08-21 21:39:00 · 226 阅读 · 0 评论