依赖关系和依赖方法 mytest:code.c称之为依赖关系 mytest是目标文件,使用make命令后,生成的运行文件叫mytest code.c是依赖文件列表,如果有多个时使用空格符隔开,例如:code.c...这里的要钱就是表明了依赖方法 项目清理 clear是一个种特殊的依赖关系,clear也是目标文件,只不过后面什么都不跟 rm -f mytest是依赖方法,是删除文件 如何理解.PHONY: 在读取makefile...文件内容时,是从上往下读取,默认认形成第一个目标文件 习惯上把形成可执行程序放在上面,make就可以直接形成 在编译时,默认情况下,如果可执行程序是最新的了,make就不会再去编译,如果就想让编译这个操作总是可以被执行...一般清理项目会总是执行,因此习惯上会有:.PHONY:clear 为什么makefile对最新的可执行程序默认不想重新生成 如果项目种存在很多个源文件,如果在这些源文件中只进行了很小的改变,如果去把所有的源文件重新编译一遍...最终需要的目标文件一定要在第一个,后面的可以乱 我们自己在使用makefile时没必要像上述代码那样写,没必要纠结那么多选项,直接可以这样写: code.exe:code.c gcc -o $@
可见,makefile都成为了一 种在工程方面的编译方法。 make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。...使用make和makefile的主要步骤如下: 创建一个makefile文件,并为各个目标指定构建规则。 在makefile中定义源文件之间的依赖关系以及对应的编译命令。...这是因为: 在终端中运行make命令时,我们可以指定目标。如果没指定,默认情况下,它只会执行makefile文件中的第一个目标规则。...我现在再用 .PHONY 修饰clean 然后执行make clean 我们发现它可以连续执行,即使被清理过了,还可以执行成功 而我们的make: 我们看到第一次可以执行,后面如果没有对源文件进行删除修改的话...那现在问题来了:我们myfile不加.PHONY修饰的时候,make执行一次之后,再执行的话就不行了,他告诉我们已经是最新的了。
当我们在命令行中输入make命令时,Make会查找当前目录下是否存在名为Makefile或makefile的文件。...targetb的意思是声明``targetb是一个伪目标,即使存在名为targetb的文件。...如果一个变量在多个地方被引用,那么只有第一次引用时会被计算,后续的引用会使用第一次计算的结果。...这意味着变量会在声明时立即被计算,并且在之后的所有引用中都会使用这个计算结果。即使变量的值在后续发生了变化,之前的引用也不会受到影响。...在规则的命令部分,$@将被替换为目标文件的名字。
4.make的工作流程 执行Makefile时,在默认的方式下,我们只输入make命令,则相当于make first_objname_in_Makefile,意思是生成出现在Makefile中第一个目标文件...的文件也是最新的啦,于是file.o的文件修改时间要比最终的可执行程序要新,所以最终的可执行程序也会被重新链接更新。...伪Target是用来显示请求执行的命令名称。 为什么使用PHONY来指明命令名称: (1)避免和同名文件冲突。...但是当存在与命令名称同名的目标文件时,一定要使用PHONY来描述命令名,因为命令名没有依赖文件,如果同名的文件始终是最新文件,那么显示make命令名时,该命令永远不会被执行。...直接执行clean这个伪目标依赖的命令。 (2)使用.PHONY指定伪目标可以改善性能。因为PHONY目标并非是由其它文件生成的实际文件,没有依赖项,make 会跳过依赖项的搜索和依赖项的更新检查。
如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名。在执行此规则时,目标总会被认为是最新的。就是说:这个规则一旦被执行,make就认为它的目标已经被更新过。...这样的目标在作为一个规则的依赖时,因为依赖总被认为被更新过,因此作为依赖所在的规则中定义的命令总会被执行。FORCE所在规则为空,也是什么都不做。...FORCE被定义为一个伪目标,所以它作为依赖时总是被认为是最新的(比目标新),故有FORCE作为依赖的目标每次make时必然会重新生成,在这里FORCE伪目标的规则命令为空,故FORCE在Kbuild体系中...如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名。在执行此规则时,目标总会被认为是最新的。就是说:这个规则一旦被执行,make就认为它的目标已经被更新过。...FORCE被定义为一个伪目标,所以它作为依赖时总是被认为是最新的(比目标新),故有FORCE作为依赖的目标每次make时必然会重新生成,在这里FORCE伪目标的规则命令为空,故FORCE在Kbuild体系中
make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写makefile,比如源文件与目标文件之间的时间关系判断之类 在makefile中可以定义变量,当makefile被执行时,其中的变量都会被扩展到相应的引用位置上...也就是只有make的时候,默认形成第一个目标文件。...3.3 PHONY:XXX 当我们在程序里面不加上: 来make一下后,在make一下,发现就不行了: 在程序不被修改时,make后,默认就不会在形成新的可执行程序,它认为没有必要。...如果想要makefile里面的操作总是被执行,不要因为是最新的就拦截,就加上:.PHONY:mytest make多少次都会执行,没有拦截。...默认将clean用.PHONY:修饰: 要然清理工作总是被执行。 为什么makefile对最新的可执行程序,默认不重新形成呢?
举例 依赖文件列表以空格进行分割,依赖文件列表可以为空,如上方的clean。上方直接使用make,为什么会执行第一对依赖关系呢?因为如果make后面什么都不跟,就会默认执行第一对依赖关系。...make是从上往下执行的。 .PHONY 格式: .PHONY:XXX 作用:修饰后XXX对应的方法总是要被执行的。...上方make使用一次后就不能继续使用了,是因为此时生成的可执行程序已经是最新的了,不需要更新。如果这里的目标文件也被,PHONY修饰,也可以一直执行。...在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。...上面是打印倒计时的程序,不过在运行时,为什么不会进行打印呢?因为\r会让光标回到行首,光标指的地方,内容就被覆盖了,下图是在VS中测试的结果,此时光标在3的位置,3就被覆盖了,无法打印出来。
通过make工具解释makefile文件中的命令,进行我们的项目编译。 2.为什么要有make/makefile?...Linux环境下开发,工程源文件较少时,可使用gcc直接编译;但当工程源文件较多时,gcc直接编译复杂(比如命令较多,文件的编译先后顺序确定问题等)且不易于后期项目的维护,因此采用make/makefile...3.伪目标 介绍伪目标前我们先讲一讲实目标的概念: 实目标:命令执行后真正要生成的文件名, test就是实目标 伪目标:命令执行后不会生成实际文件,常用于辅助操作, .PHONY是伪目标的标注符...:clean clean: @rm -rf test @: 不带@在命令行执行make的时候,会将所执行的命令回显到终端,带@则不回显 为什么在命令行执行的时候,执行第一组依赖关系和依赖方法的命令是...到这里我们也能解释为什么.PHONY有一个特点:被.PHONY修饰的总是能被执行,那可能就是.PHONY修饰后不再通过比较test和test.c的修改时间来判断是否要重新编译!
、Q= @,make在执行Makefile命令时就不会向屏幕输出所执行的命令。...规则的命令部分有两种书写方式: a、目标、依赖描述和命令放在同一行,目标和依赖描述使用冒号(:)分隔开,在依赖文件列表后使用分号(;)把依赖文件列表和命令分开。...如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名。在执行此规则时,目标总会被认为是最新的。就是说:这个规则一旦被执行,make就认为它的目标已经被更新过。...这样的目标在作为一个规则的依赖时,因为依赖总被认为被更新过,因此作为依赖所在的规则中定义的命令总会被执行。FORCE所在规则为空,也是什么都不做。...FORCE被定义为一个伪目标,所以它作为依赖时总是被认为是最新的(比目标新),故有FORCE作为依赖的目标每次make时必然会重新生成,在这里FORCE伪目标的规则命令为空,故FORCE在Kbuild体系中
1、Makefile伪目标的格式: .PHONY : clean clean: rm xxxx 2、Makefile伪目标的作用: 第一种情况: 如果我们需要书写这样的一个规则:规则所定义的命令不是去创建目标文件...当文件夹中没有clean这个文件的时候,我们输入“make clean”能按照初衷执行,但是一旦文件夹中出现clean文件,我们再次输入“make clean”,由于这个规则没有任何依赖文件,所以目标被认为是最新的而不去执行规则所定义的命令...clean: rm xxxx 如果同一个目录下有一个clean文件,那么 make clean的动作将不会执行rm动作; 所以,增加.PHONY伪目标的使用的话,就会忽略目录下clean这个文件,...直接执行rm动作; 第二种情况: 伪目标的另一种使用场合时在make的并行和递归执行过程中。...) –C $$dir done 如果这样写,会出现几个问题: 1、 当子目录执行make出现错误,make不会退出; 2、 使用这种shell的循环方式时,没有用到make
Makefile的基本格式 目标:依赖 命令 目标是要生成的结果,依赖是生成结果需要的源文件和上一步骤的结果,命令是当目标不存在或者依赖更新时执行的命令。.../simv -xxx 这个例子中,sim并不是要生成的结果文件,而只是我们给操作起的一个名字。由于伪目标总是不存在,所以命令也一定会重新执行,即使simv没有修改。.../simv -xxx 这样,当我们不记得如何使用Makefile的时候,直接敲make就会有使用帮助菜单。另外,我们还可以看到,一个目标后面可以执行多条命令,比如这里的三条echo命令。...在顶层目录里make clean时,将会自动调用子目录的make clean。这个怎么实现呢?看下面的例子: 示例九: ....这样在顶到make clean时,将自动递归到所有的子目录。
/simv -xxx 这个例子中,sim并不是要生成的结果文件,而只是我们给操作起的一个名字。由于伪目标总是不存在,所以命令也一定会重新执行,即使simv没有修改。.../simv -xxx 这样,我们在terminal里就可以用make sim来调用仿真命令。 默认目标 如果我们只是敲make(后面不跟目标),那么将调用Makefile里的第一个目标。.../simv -xxx 这样,当我们不记得如何使用Makefile的时候,直接敲make就会有使用帮助菜单。另外,我们还可以看到,一个目标后面可以执行多条命令,比如这里的三条echo命令。...在顶层目录里make clean时,将会自动调用子目录的make clean。这个怎么实现呢?看下面的例子: 示例九: cat ....这样在顶到make clean时,将自动递归到所有的子目录。
文章目录 一、什么是 make/makefile 二、如何编写 makefile 三、make 的工作原理 1、make 的使用 2、make 的依赖性 3、项目清理 4、.PHONY 伪目标 四、Linux...---- 三、make 的工作原理 1、make 的使用 在Linux下,我们输入 make 命令后,make 会在当前目录下找寻名为 “Makefile” 或 “makefile” 的文件;如果找到,...,.PHONY 的原理和作用也显而易见了 – 被 .PHONY 修饰的目标文件不根据文件的修改时间先后来判断是否需要重新执行,从而达到总是被执行的效果。...; 可以看到,我们C语言中的 ‘\n’ 的作用是 回车 + 换行,而不仅仅是换行,这也是为什么许多台式机的 enter 键是下面这样的: 2、行缓冲 在C语言 getchar 函数的正确使用 中我们就已经知道...注意:在 printf 函数中,% 具有特殊意义,所以我们需要输入 %% 来对其进行转义;同样,在 label 数组中,字符 ‘\’ 也是特殊字符,我们需要输入 ‘\\’; 最终得到的进度条的运行效果如下
命令行属性: 可在命令前、Tab键后加上如下符号: -:执行本命令行如果遇到错误,继续执行而不退出make。 +:总是执行该命令,即使执行make时使用了-n,-q,-t选项。...伪目标: 先看以下代码: clean: -rm -rf *.o 因为clean后没有依赖文件,所以clean被认为是最新,不会执行rm命令,若要执行rm,需要执行make clean命令。....PHONY:clean clean: -rm -rf *.o .PHONY的依赖文件为伪目标,作用是伪目标的命令即使在当前目录下存在与伪目标同名的文件时也执行该命令。...特殊目标: .PHONY:伪目标,如上 .IGNORE:对于该目标后的依赖文件,生成时如遇到错误则可跳过错误继续执行,不会中断make。....SUFFIXES:该目标的依赖被认为是一个后缀列表,在检查后缀规则时使用。 .SILENT:生成该目标文件的依赖文件所执行的命令都不被打印,如果其后无依赖文件,则所有的命令都不会被打印。
指令的使用,则需要我们在Makefile文件中将任务进行编写。...关于make 我们在上面演示了make mytest 实现自动编译,但是我们发现,即使我们输入make这个指令,也依然可以实现自动编译,这是为什么呢?....PHONY 我们上面已经说了,假如文件最近的属性没有发生改变(这里主要是指文件的最近修改时间),我们再次执行make指令,会发生报错,我们的解决方法是我们打开这个文件,不做修改再保存并退出来,就可以再次使用...有的,就是利用 .PHONY,.PHONY是Makefile中的一个关键字: 对某对象生成伪目标,它的作用 就是可以使我们在不对文件的属性进行修改的情况下,任意使用make指令。...使用方法 用起来也很简单,在任务的上方用.PHONY对我们的文件进行修饰一下即可,如下: 实战练习:多文件的同时编译 是不是会方便很多,假如项目特别多的话,我们只需要按照要求,将任务写好,然后便可以实现自动化构建
-o OK test.c //这种写法也是可以的 在我们使用 gcc/g++ 时,都可以通过 -o 选项生成指定文件 -E 预处理 在C语言学习阶段,我们学习了源文件变成可执行文件的过程,即预处理...,在原文件最近修改时间没有发生变化时,无法再执行任务,这背后的原因是方法是否执行会先判断生成的目标文件是否为最新,如果为最新,就不再执任务 举例:重复执行 make myfile 任务 $ make myfile...,使源目标文件不是最新时间 .PHONY 伪目标 .PHONY 是 Makefile 文件中的一个关键字,意为对某某对象生成伪目标,这样就能在不对源文件进行修改的情况下,重复执行任务了 //Makefile...文件中 .PHONY:myfile 在使用关键字 .PHONY 对目标进行修饰后,可以无视任务刷新策略,重复执行任务了 不过这有什么意义呢?...: rm -r myfile 换个角度想想,当我们把生成的原目标文件清理后,再执行任务,生成目标文件是一件很合理的事,也完全符合任务刷新策略 由此来看,.PHONY 也是很有用的 注意: 像 clean
gcc就可以编译得到想要的程序了: $ gcc -o main main.c -lm (如果不理解为什么要加-lm,请参考《一个奇怪的链接问题》)。...使用的基本流程,生成目标,清除目标。...,因此需要加一个伪目标clean: .PHONY:clean clean: rm $(OBJ) $(TARGET) 伪目标的意思是,它不是一个真正的要生成的目标文件,.PHONY:clean说明了...在这种情况下,即使当前目录下有clean文件,它也仍然会执行后面的指令。 否则如果当前目录下有clean文件,将不会执行rm动作,而认为目标文件已经是最新的了。...注意,由于第一个目标是main.o,因此你单单执行make的时候,它只是会生成main.o而已,如果你再执行一次会发现它提示你说main.o已经是最新的了: $ make gcc -g -Wall -c
大家好,又见面了,我是你们的朋友全栈君。 三、make是如何工作的 在默认的方式下,也就是我们只输入make命令。...的文件也是最新的啦,于是file.o的文件修改时间要比edit要新,所以edit也会被重新链接了(详见edit目标文件后定义的命令)。...所以,为了makefile的易维护,在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成C语言中的宏可能会更好。...上面文件内容中,“.PHONY”表示,clean是个伪目标文件。 关于更为详细的“隐晦规则”和“伪目标文件”,我会在后续给你一一道来。...来看看最新风格的makefile吧。
make与make clean 生成目标文件规则(make命令): 执行make命令则会根据当前目录的Makefile文件定义的规则生成对应的目标文件。...:增加伪目标:.PHONY:clean: .PHONY:clean clean: rm $(obj) *.o 注意: clean的规则不要放在文件 的开头,不然,会变成make的默认目标,一般...书写规则 显示规则(@字符): 当用@字符在命令前面时,那么执行这条命令的时候,这条命令不会显示出来。...echo "rice makefile" rice makefile 注意: make命令参数 -s 或 --silent 或 --quiet 则是全面禁止命令的显示 命令执行规则: 当依赖目标新于目标时...其中,加入要让上一条命令的结果应用在下一条命令时,应使用分号分隔这两条命令,并且不能将两条命令写在同一行。
本文介绍如何使用make命令,作为网站的构建工具。以下内容既是make语法的实例,也是网站构建的实战教程。你完全可以将代码略作修改,拷贝到自己的项目。 ?...(题图:国家考古博物馆,西班牙,摄于2014年8月) 一、Make的优点 首先解释一下,为什么要用Make。 目前,网站项目(尤其是Node.js项目)有三种构建方案。...即使是文件改名这样简单的任务,都要写插件,相当麻烦。而Make是直接调用命令行,根本不用担心找不到插件。...$ make UGLIFY=node_modules/.bin/jsmin min 上面代码,将jsmin命令给变量UGLIFY,压缩时就会使用jsmin命令。...使用时调用下面的命令。 $ make build 如果这行规则在Makefile的最前面,执行时可以省略目标名。 $ make 通常情况下,make一次执行一个任务。
领取专属 10元无门槛券
手把手带您无忧上云