我有两个c源文件,prog2.c
和getopts.c
。我的prog2.c
和getopts.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 clean
和make
。对于make clean
命令,我收到以下错误:无法删除...没有文件或目录错误,后跟make:***[clean] Error 1.
我执行make
命令,我收到以下错误:make:***没有规则来制作目标'gcc','all'需要。停止。我经历了一些网页和类似的问题,但我真的没有得到它。
答案 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”目标作为你有点不寻常。