Makefile:每次使用make命令时都会重新编译该文件

时间:2017-10-24 14:49:05

标签: c makefile virtual-machine

我刚开始上大学,目前的家庭作业就是这样:

创建一个名为Makefile的makefile文件,该文件使用目标文件light.o和通过编译源文件sound.c获得的目标文件sound.o。

收到 make make build 命令后,必须生成名为 fight 的可执行文件。同时添加一个名为" optim "的规则生成 O2级优化文件

同时添加名为" 运行"的规则只有在修改了使用过的文件时才会重新编译整个程序。

还要添加名为 clean 的规则,该规则会删除您创建的文件和创建的可执行文件。我把战斗名称与XX放在一起,因为检查员说名字斗争不能出现在makefile中。

我使用自动变量编写了makefile(它们是任务所需的),当我运行作业检查器时,它说任务不完整,因为每次使用命令make都会重新编译文件。

以下是makefile的内容:

CC= gcc
CFLAGS= -Wall -g
XX= fight

run: sound.o light.o
        $(CC) sound.o light.o -o $(XX)
        ./$(XX)

sound: sound.o
        $(CC) sound.o -o sound

sound.o: sound.c
        $(CC) $(CFLAGS)  -c sound.c

optim: sound.o light.o
        $(CC) -O2 sound.o light.o

clean:
        rm -f sound sound.o $(XX)

https://i.stack.imgur.com/BE3AW.png

以下是我拥有的文件的图像(主要是由编译sound.c产生的light.o和声音组件。)我把它放在以防万一我可能需要使用更多这些文件并省略它们。 / p>

我想要一些帮助,你认为我应该添加什么,所以只有在修改文件时才重新编译。

1 个答案:

答案 0 :(得分:1)

  

任务不完整,因为每次使用命令make都会重新编译文件。

看这里:

XX= fight
run: sound.o light.o
        $(CC) sound.o light.o -o $(XX)
        ./$(XX)

make规则的目标部分(此处为run)应该是该规则的配方创建的文件的名称。您永远不会创建文件run,因此此配方始终执行。这样做的正确方法如下:

run: fight

fight: sound.o light.o
        $(CC) sound.o light.o -o$@
        ./$@

# this is to let make know that `run` does not create a file:
.PHONY: run