企业服务网站制作,深圳小程序网站开发公司,做网站要先申请域名吗,wordpress调整页面布局以下内容源于C语言中文网的学习与整理#xff0c;非原创#xff0c;如有侵权请告知删除。 伪目标#xff0c;它的目的并不是创建目标文件#xff08;所以称作“伪”#xff09;#xff0c;而是想去执行这个目标下面的命令。它有点像汇编语言里的标签。 使用伪目标的原因非原创如有侵权请告知删除。 伪目标它的目的并不是创建目标文件所以称作“伪”而是想去执行这个目标下面的命令。它有点像汇编语言里的标签。 使用伪目标的原因避免Makefile中定义的只为了执行命令的目标与实际文件的名字出现冲突提高执行 make 时的效率。 如果书写这样一个规则规则所定义的命令不是去创建文件而是通过 make 命令明确指定它来执行一些特定的命令比如 clean:rm -rf *.o test 规则中 rm 命令不是为了创建 clean 这个文件而是执行删除某些文件的任务。当工作目录中不存在以 clean 命令的文件时在 shell 中输入 make clean 命令命令 rm -rf *.o test 总会被执行 这也是我们期望的结果。 但是如果当前目录下存在文件名为 clean 的文件时我们在 shell 中执行命令 make clean时由于这个规则没有依赖文件所以目标被认为是最新的从而不去执行规则所定义的命令因此命令 rm 将不会被执行。为了解决这个问题删除 clean 文件或者是在 Makefile 中将目标 clean 声明为伪目标。这段话怎么理解目录中是否存在clean这个文件都改变不了目标clean没有依赖文件的事实啊按理都不会执行啊 将一个目标声明称伪目标的方法是把它作为特殊的目标.PHONY的依赖如下 .PHONY:clean 这样 clean 就被声明成一个伪目标无论当前目录下是否存在 clean 这个文件当我们执行 make clean 后 rm 都会被执行。而且当一个目标被声明为伪目标之后make 在执行此规则时不会去试图查找隐含的关系去创建它。这样同样提高了 make 的执行效率同时也不用担心目标和文件名重名而使编译失败。 在书写伪目标的时候需要声明目标是一个伪目标之后才是伪目标的规则定义。目标 clean 的完整书写格式如下 .PHONY:clean
clean:rm -rf *.o test 伪目标的另一种使用的场合是在 make 的并行和递归执行的过程中。此情况下一般会存在一个变量定义为所有需要 make 的子目录。对多个目录进行 make 的实现可以在一个规则的命令行中使用 shell 循环来完成。如下 SUBDIRSfoo bar baz
subdirs:for dir in $(SUBDIRS);do $(MAKE) -C $$dir;done 代码表达的意思是当前目录下存在三个子文件目录每个子目录文件都有相对应的 Makefile 文件代码中实现的部分是用当前目录下的 Makefile 控制其它子模块中的 Makefile 的运行但是这种实现方法存在以下几个问题 当子目录执行 make 出现错误时make 不会退出。就是说在对某个目录执行 make 失败以后会继续对其他的目录进行 make。在最终执行失败的情况下我们很难根据错误提示定位出具体在哪个目录下执行 make 发生的错误。这样给问题定位造成很大的困难。为了解决问题可以在命令部分加入错误检测在命令执行的错误后主动退出。不幸的是如果在执行 make 时使用了 -k 选项此方式将失效。另外一个问题就是使用这种 shell 循环方式时没有用到 make 对目录的并行处理功能由于规则的命令是一条完整的 shell 命令不能被并行处理。有了伪目标之后我们可以用它来克服以上方式所存在的两个问题代码展示如下 SUBDIRSfoo bar baz
.PHONY:subdirs $(SUBDIRS)
subdirs:$(SUBDIRS)
$(SUBDIRS):$(MAKE) -C $
foo:baz 上面的实例中有一个没有命令行的规则“foo:baz”这个规则是用来规定三个子目录的编译顺序。因为在规则中 baz 的子目录被当作成了 foo 的依赖文件所以 baz 要比 foo 子目录更先执行最后执行 bar 子目录的编译。 一般情况下一个伪目标不作为另外一个目标的依赖。这是因为当一个目标文件的依赖包含伪目标时每一次在执行这个规则伪目标所定义的命令都会被执行因为它作为规则的依赖重建规则目标时需要首先重建规则的所有依赖文件。当一个伪目标没有任何目标此目标是一个可被创建或者是已存在的文件的依赖时我们只能通过 make 的命令来明确的指定它的终极目标执行它所在规则所定义的命令。例如 make clean。 如果在一个文件里想要同时生成多个可执行文件我们可以借助伪目标来实现。使用方式如下 .PHONY:all
all:test1 test2 test3
test1:test1.ogcc -o $ $^
test2:test2.ogcc -o $ $^
test3:test3.ogcc -o $ $^ 在当前目录下创建了三个源文件目的是把这三个源文件编译成为三个可执行文件。将重建的规则放到 Makefile 中约定使用 all 的伪目标来作为最终目标它的依赖文件就是要生成的可执行文件。这样的话只需要一个 make 命令就会同时生成三个可执行文件。 之所以这样写是因为伪目标的特性它总会被执行所以它依赖的三个文件的目标就不如 all 这个目标新所以其他的三个目标的规则总是被执行这也就达到了我们一口气生成多个目标的目的。我们也可以实现单独编译这三个中的任意一个源文件比如我们想去重建 test1可以执行命令make test1 来实现 。