make:*** [clean]错误1并且没有规则来制作目标错误

时间:2016-07-17 05:14:17

标签: c unix emacs makefile

我有两个c源文件,prog2.cgetopts.c。我的prog2.cgetopts.c文件相互链接。我从我的分配方向制作了以下makefile :

OPTS= -g -c -Wall -Werror
efile = shell
ofile = prog2.o getopts.o
all: gcc -0 $(efile) <$(ofile)>

shell: \
prog2.o getopts.o
    gcc prog2.o getopts.o -o shell

prog2.o: \
prog2.c
    gcc $(OPTS) prog2.c

getopts.o: \
getopts.c
    gcc $(OPTS) getopts.c

clean:
    rm $(ofile) $(efile)

方向说:对于最终链接,我需要使用gcc -o efile <ofiles>,其中efile是可执行文件(我相信这将是shell),而ofiles是所有.o文件的列表。然后我被告知命令make cleanmake。对于make clean命令,我收到以下错误:无法删除...没有文件或目录错误,后跟make:***[clean] Error 1.我执行make命令,我收到以下错误:make:***没有规则来制作目标'gcc','all'需要。停止。我经历了一些网页和类似的问题,但我真的没有得到它。

1 个答案:

答案 0 :(得分:1)

首先,在make文件中构建目标的命令与目标名称不在同一行,但在以下行中,每个前面都有一个选项卡...所以gcc -0 $(efile) <$(ofile)>是在错误的地方。

其次,方向上的尖括号可能并不意味着实际出现在你的命令中。

此外,如果目标需要首先构建其他目标,那么这些目标应该在目标名称之后列为依赖项,并用冒号分隔。

而且,为gcc指定输出文件的选项是-o而不是-0

因此,您的all目标变为:

all: $(ofile)
    gcc -o $(efile) $(ofile)

运行make clean时发生错误,因为它尝试删除的文件不存在,因为尚未成功构建。为rm添加“force”选项会导致它“忽略不存在的文件和参数,从不提示”,这样即使文件丢失且make没有抱怨,命令也会成功。这就变成了:

clean:
    rm -f $(ofile) $(efile)

请注意,通常使用makefile构建的各个程序和库都有自己的目标,而“all”通常只取决于它们中的每一个,以便所有这些程序都被构建...所以使用“all”目标作为你有点不寻常。