我的Makefile就是不起作用。

我的Makefile就是不起作用。,makefile,Makefile,我有一个makefile,但它不工作。你们能帮我找出错误在哪里吗?谢谢 CC = gcc FILES = workfile.c insert.c TARGETS = exe CFLAGS = -o DBUG = RM = rm -f OBJS = *.o #Master Rule all: $(TARGETS) #Build exe: workfile.o insert.o $(CC) $(CFLAGS) $(DBUG) workfile.o insert.o exe #wor

我有一个makefile,但它不工作。你们能帮我找出错误在哪里吗?谢谢

CC = gcc
FILES = workfile.c insert.c
TARGETS = exe
CFLAGS = -o
DBUG =
RM = rm -f
OBJS = *.o

#Master Rule

all: $(TARGETS)

#Build

exe: workfile.o insert.o
    $(CC) $(CFLAGS) $(DBUG) workfile.o insert.o exe

#workfile

workfile.o: workfile.c
    $(CC) $(DBUG) -c *.c

insert.o: insert.c
    $(CC) $(DBUG) -c *.c

clean:  
    $(RM) $(TARGETS) $(OBJS)
错误如下

$make all
gcc  -c *.c
gcc -o  workfile.o insert.o exe
gcc: error: exe: No such file or directory
make: *** [exe] Error 1

我甚至试着改变目标的名字。但是没有帮助。不能再继续了

您的
CFLAGS
使用错误。
-o
选项应该放在
exe
之前,
CFLAGS
应该包含编译器的相关标志(
-O3-Wall-Wextra-Werror

试试这个:

CFLAGS = -Wall -Wextra -Werror

exe: workfile.o insert.o
    $(CC) $(CFLAGS) $(DBUG) workfile.o insert.o -o exe

注:您可以根据需要剥离
DBUG
并将
-g
粘贴在
CFLAGS
中。这就是它在普通makefile中的用法。

您的
CFLAGS
使用错误。
-o
选项应该放在
exe
之前,
CFLAGS
应该包含编译器的相关标志(
-O3-Wall-Wextra-Werror

试试这个:

CFLAGS = -Wall -Wextra -Werror

exe: workfile.o insert.o
    $(CC) $(CFLAGS) $(DBUG) workfile.o insert.o -o exe

注:您可以根据需要剥离
DBUG
并将
-g
粘贴在
CFLAGS
中。这就是它在普通makefile中的用法。

嗯,我知道了。。。在cflags中有一个
-o
。我认为您不应该在
CFLAGS
中使用
-o
,因为它需要一个参数

可以改变的重要部分:

CFLAGS = 
OUTFILE = fancy_exe
[...]
$(CC) $(CFLAGS) $(DBUG) workfile.o insert.o -o $(OUTFILE)

这应该更有效。。。或者甚至跳过outfile变量,手工输入exe。

嗯,我知道了。。。在cflags中有一个
-o
。我认为您不应该在
CFLAGS
中使用
-o
,因为它需要一个参数

可以改变的重要部分:

CFLAGS = 
OUTFILE = fancy_exe
[...]
$(CC) $(CFLAGS) $(DBUG) workfile.o insert.o -o $(OUTFILE)

这应该更有效。。。或者甚至跳过outfile变量并手动放置exe。

我认为将
-o
放在
CFLAGS
中不是一个好主意,我宁愿从中删除
-o

CFLAGS=-o
->
CFLAGS=

现在您可以使用
exe
,输出路径应该立即跟随
-o

exe: workfile.o insert.o
    $(CC) $(CFLAGS) $(DBUG) workfile.o insert.o exe
=>

因此,完整的makefile应该如下所示:

CC = gcc
FILES = workfile.c insert.c
TARGETS = exe
CFLAGS =
DBUG =
RM = rm -f
OBJS = *.o

#Master Rule

all: $(TARGETS)

#Build

exe: workfile.o insert.o
    $(CC) $(CFLAGS) $(DBUG) -o exe workfile.o insert.o

#workfile

workfile.o: workfile.c
    $(CC) $(DBUG) -o workfile.o -c workfile.c

insert.o: insert.c
    $(CC) $(DBUG) -o insert.o -c insert.c

clean:  
    $(RM) $(TARGETS) $(OBJS)

我认为将
-o
放在
CFLAGS
中不是一个好主意,我宁愿从中删除
-o

CFLAGS=-o
->
CFLAGS=

现在您可以使用
exe
,输出路径应该立即跟随
-o

exe: workfile.o insert.o
    $(CC) $(CFLAGS) $(DBUG) workfile.o insert.o exe
=>

因此,完整的makefile应该如下所示:

CC = gcc
FILES = workfile.c insert.c
TARGETS = exe
CFLAGS =
DBUG =
RM = rm -f
OBJS = *.o

#Master Rule

all: $(TARGETS)

#Build

exe: workfile.o insert.o
    $(CC) $(CFLAGS) $(DBUG) -o exe workfile.o insert.o

#workfile

workfile.o: workfile.c
    $(CC) $(DBUG) -o workfile.o -c workfile.c

insert.o: insert.c
    $(CC) $(DBUG) -o insert.o -c insert.c

clean:  
    $(RM) $(TARGETS) $(OBJS)

您已将
exe
指定为此处的输入之一
$(CC)$(CFLAGS)$(DBUG)workfile.o insert.o exe
。这是有意的吗?也许你的意思是
-o exe
@luk32是的,这是故意的。:)如果您打算这样做,则在规则运行之前必须存在
exe
。你只是把
-o
选项放错了地方。@Shash真的吗?exe是输入的一部分吗?因为您似乎将-o放错了位置,
exe
是输出文件名,而不是输入文件的一部分=P@luk32我可以使用我的makefile,它现在运行良好。我之前想感谢你们这些好人。我已删除了我令人困惑的评论。:)您已将
exe
指定为此处的输入之一
$(CC)$(CFLAGS)$(DBUG)workfile.o insert.o exe
。这是有意的吗?也许你的意思是
-o exe
@luk32是的,这是故意的。:)如果您打算这样做,则在规则运行之前必须存在
exe
。你只是把
-o
选项放错了地方。@Shash真的吗?exe是输入的一部分吗?因为您似乎将-o放错了位置,
exe
是输出文件名,而不是输入文件的一部分=P@luk32我可以使用我的makefile,它现在运行良好。我之前想感谢你们这些好人。我已删除了我令人困惑的评论。:)