首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

跟我一起写Makefile:MakeFile介绍

(任意的shell命令) 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在 command中。...于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如file.c,那么根据我们的依赖性,我们的目标file.o会被重编译(也就是在这个依性关系后面所定义的命令),于是file.o...上面文件内容中,“.PHONY”表示,clean是个伪目标文件。 关于更为详细的“隐晦规则”和“伪目标文件”,我会在后续给你一一道来。...清空目标文件的规则 每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《编程修养》吗)。...Makefile的文件名 默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。

99820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    换个角度说Makefile

    然而实际上这里面的门道还有很多,例如伪目标,自动推导,隐晦规则,变量定义。本文作为认识性的文章暂时不具体介绍。 总结来说就是,给规则,按照规则生成目标。 makefile做了什么?...那么放到makefile中具体要做什么呢?...将源代码文件编译成可重定位目标文件.o(参考《静态库和动态库的区别》) 设置编译器选项,例如是否开启优化,传递宏,打开警告等 链接,将静态库或动态库与目标文件链接 所以问题就变成了,如何利用makefile...当然你也可以调整目标顺序。...安装程序 其中最关键的事情就是编译链接,即想办法把.c变成.o(可重定位目标文件);.o+.so(动态库)+.a(静态库)变成可执行文件。

    76220

    跟我一起写Makefile

    (任意的shell命令) 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在 command中。...于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如file.c,那么根据我们的依赖性,我们的目标file.o会被重编译(也就是在这个依性关系后面所定义的命令),于是file.o...上面文件内容中,“.PHONY”表示,clean是个伪目标文件。 关于更为详细的“隐晦规则”和“伪目标文件”,我会在后续给你一一道来。...清空目标文件的规则 每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《编程修养》吗)。...Makefile的文件名 默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。

    1.1K70

    Linux 下的make命令与Makefile

    其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。 当前,我们也可以给make命令指定一个特殊名字的Makefile。...在Unix世界中,软件发布时,特别是GNU这种开源软件的发布时,其makefile都包含了编译、安装、打包等功能。 我们可以参照这种规则来书写我们的makefile中的目标。...-B, –always-make 认为所有的目标都需要更新(重编译)。 -C , –directory= 指定读取makefile的目录。...v: 也就是verbose,在b选项的级别之上。输出的信息包括哪个makefile被解析,不需要被重编译的依赖文件(或是依赖目标)等。 i: 也就是implicit,输出所以的隐含规则。...下面是所有的自动化变量及其说明: •@ : 表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,@ 就是匹配于目标中模式定义的集合。 •% : 仅当目标是函数库文件中,表示规则中的目标成员名。

    10.2K20

    深度刨析makefile

    在 makefile 文件中描述了整个工程所有文件的编译顺序、编译规则等。makefile 有自己的书写格式、关键字、函数,就像任何一门编程语言有自己的语法一样。.../mkdir2/ 搜索,搜索的顺序是先当前目录,然后按照变量赋值中的顺序去搜索。...,在生成目标时,一个个的取出来去执行命令 $^ 所有依赖文件(无重复文件),用空格分隔并且会自动去重 $?...实际上,make 中存在一个隐含规则库,这个隐含规则库中的每一条隐含规则都有相应的优先级顺序,优先级也就会越高(顺序在前的优先级高),也就会被优先使用。...(2)隐含规则都有哪些 隐含规则按照执行顺序排列如下: 编译 C 程序的隐含规则.o 的目标的依赖目标会自动推导为 .c ,并且其生成命令是 (CC) –c (CPPFLAGS) 编译 C++ 程序的隐含规则

    13210

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

    七、清空目标文件的规则 每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《编程修养》吗)。...在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。...v —— 也就是verbose,在b选项的级别之上。输出的信息包括哪个makefile被解析,不需要被重编译的依赖文件(或是依赖目标)等。 i —— 也就是implicit,输出所以的隐含规则。...还有,在make的“隐含规则库”中,每一条隐含规则都在库中有其顺序,越靠前的则是越被经常使用的,所以,这会导致我们有些时候即使我们显示地指定了目标依赖,make也不会管。...Make默认的编译命令是“cc”,如果你把变量“(CC)”重定义成“gcc”,把变量“(CFLAGS)”重定义成“-g”,那么,隐含规则中的命令全部会以“gcc –c -g (CPPFLAGS)”的样子来执行了

    4.3K20

    全网最牛Linux内核Makefile系统文件详解(纯文字代码)

    七、清空目标文件的规则 每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《编程修养》吗)。...在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。...一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make 所完成的也就是这个目标。...“目标”以备完整地重编译而用。...make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟在依赖规则后面的分号后的。

    3.3K20

    Make参数

    -b -m 这两个参数的作用是忽略和其它版本make的兼容性。 -B –always-make 认为所有的目标都需要更新(重编译)。 -C –directory= 指定读取makefile的目录。...(会非常的多)b —— 也就是basic,只输出简单的调试信息。即输出不需要重编译的目标。v —— 也就是verbose,在b选项的级别之上。...输出的信息包括哪个makefile被解析,不需要被重编译的依赖文件(或是依赖目标)等。i —— 也就是implicit,输出所以的隐含规则。...j —— 也就是jobs,输出执行规则中命令的详细信息,如命令的PID、返回码等。...-p –print-data-base 输出makefile中的所有数据,包括所有的规则和变量。这个参数会让一个简单的makefile都会输出一堆信息。

    1.6K11

    什么是makefile(3)

    七、清空目标文件的规则 每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。...而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。...Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。 1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。...二、Makefile的文件名 默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。...这个变量中的值是其它的Makefile,用空格分隔。只是,它和include不同的是,从这个环境变中引入的Makefile的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。

    57620

    Makefile经典教程(掌握这些足够)

    1.7 清空目标文件的规则       每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。...在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。...一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标。...还有,在make的“隐含规则库”中,每一条隐含规则都在库中有其顺序,越靠前的则是越被经常使用的,所以,这会导致我们有些时候即使我们显示地指定了目标依赖,make也不会管。...Make默认的编译命令是“cc”,如果你把变量“$(CC)”重定义成“gcc”,把 变量“$(CFLAGS)”重定义成 “-g”,那么,隐含规则中的命令全部会以“gcc –c -g $(CPPFLAGS

    2.8K20

    技术栈系列基础篇2-Makefile

    Makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率Makefile里有什么Makefile里包含了:显示规则、隐晦规则、...显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。隐晦规则。...其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令...TAGS这个伪目标功能是更新所有的目标,以备完整地重编译使用。check 和test这两个伪目标一般用来测试makefile的流程。常见问题1....立即赋值(:=) 和延迟赋值(=):=: 强制按先后顺序执行,立即赋值。=:赋值的结果会等到整个路径执行完再决定,后面的会覆盖前面的,延迟赋值。

    59130

    跟我一起写 Makefile(二)

    2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。    ...4、如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。...于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如file.c,那么根据我们的依赖性,我们的目标file.o会被重编译(也就是在这个依性关系后面所定义的命令),于是file.o...上面文件内容中,“.PHONY”表示,clean是个伪目标文件。 关于更为详细的“隐晦规则”和“伪目标文件”,我会在后续给你一一道来。...七、清空目标文件的规则 每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《编程修养》吗)。

    23430

    【Linux】gccg++的使用 自动化构建工具makemakefile的使用

    //.o 文件可重定位目标二进制文件,简称目标文件, //不可以独立执行,需要经过链接才能执行 gcc test.o -o test.exe...Esc键,顺序刚好和上面的顺序一致,所以不记得的时候,看一眼电脑左上角,不过要记住大小写。.../test.exe g++和gcc的使用差不多,就不赘述了。 二.make/makefile make 是指令,makefile是文件,两个是配套使用的。...编译生成可执行文件时,只需一次性把代码写到makefile文件里,在使用make命令就可以一件生成了,省去了重复写的麻烦,并且这个make是递归式生成的,所以写依赖关系和依赖方法时,不用担心顺序的问题。...可是我们发现一次make后,第二次就不能make了 这是因为make有这样一个规则: 对于可执行文件和源文件的最后一次修改时间: 若可执行文件新于源文件,则不需要再次编译;

    43110

    makefile文件编写「建议收藏」

    c和test2.c添加到C_SRCS中,其代码如下所示: C_SRCS := C_SRCS += test1.c test2.c 在makefile中有一类特殊的变量,其名称为 自动变量,自动变量的值会依据规则中的...foreach 函数:其语法为$(foreach var,list,text),每循环一次var从list中按顺序取值一个,然后执行一次text代码并记录结果,最终返回所用text代码运行的结果。...: 规则是makefile中最重要的概念,其告诉make 目标文件的依赖关系,以及如何生成及更新这些目标文件。...在makefile中,我们通常要编写3种隐式规则,第1种为代码链接规则,第2种为源代码编译规则,第3种为汇编代码编译规则。...,这样当头文件信息改变后,make程序就知道如何更新目标文件了,而不是整个进行重编译,但这个操作可以看出是非常消耗时间及傻瓜式的,作为解决方案我们可以通过使用 编译器命令 –M选项来自动完成该工作,比如在

    3.2K11

    Makefile 使用总结

    在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。 $%     仅当目标是函数库文件中,表示规则中的目标成员名。...中可以引用其他Makefile) 读入被include的其他Makefile 初始化文件中的变量 推导隐晦规则, 并分析所有规则 为所有的目标文件创建依赖关系链 根据依赖关系, 决定哪些目标要重新生成...                          :: 清除所有已经设置好的文件路径 # 示例1 - 当前目录中找不到文件时, 按顺序从 src目录 ....., 即强制重编译 2.10 Makefile 隐含规则 这里只列一个和编译C相关的....或是gz文件 TAGS 更新所有的目标, 以备完整地重编译使用 check 或 test 一般用来测试makefile的流程

    3.6K30

    实战Makefile前,该知道那些知识?

    make与make clean 生成目标文件规则(make命令): 执行make命令则会根据当前目录的Makefile文件定义的规则生成对应的目标文件。...清空目标文件的规则(make clean命令): 每个Makefile中都应该写一个清空目标文件( .o 和目标文件等)的规则,这不仅便于重编译,也很 利于保持文件的清洁。...命令参数 -s 或 --silent 或 --quiet 则是全面禁止命令的显示 命令执行规则: 当依赖目标新于目标时,make会一条一条的执行其后的命令。...如果一个规则中的某个命令出错了(命令退出码 非零),那么make就会终止执行当前规则,这将有可能终止所有规则的执行。 有时命令的出错并不表示错误。...这些变量可以让我们更加快速的完成Makefile的编写,其中自动变量只能在规则中的命令使用,常用的自动变量如下: $@:规则中的目标 $规则中的第一个依赖文件 $^:规则中的所有依赖文件 CC

    48920

    Makefile基础语法

    Makefile 是描述文件依赖关系的说明,由若干个规则组成,每个 规则 的格式如下: 目标:依赖关系 命令 其中: 目标 是指 make 最终要创造的产物,也是 make 执行的动作名称...除了 Makefile ,还可将文件命名为 GNUmakefile, makefile ,命令执行时按照 GNUmakefile,Makefile, makefile 的顺序搜索 Makefile 文件...$@ # 规则目标对应的文件名 $* # 不包含扩展名的目标文件名称 $+ # 所有的依赖文件,用空格分开,可能包含重复 $% # 如果目标是归档成员,则该变量标识目标的归档成员名称...$规则中第一个依赖文件名 $^ # 规则中所有依赖的列表,空格分隔 $?...# 规则中日期新于目标的所有依赖文件的列表,空格分隔 $(@D) # 目标文件的目录部分 $(@F) # 目标文件的文件名部分 --------------------- Author: Frytea

    82420
    领券