在makefile中看到意外的行尾

时间:2016-12-01 21:41:36

标签: makefile

all: operation

operation: operation.o operation_functions.o
    $(gcc) $(-std=c99 -Wall) -o operation operation.o operation_functions.o

operation.o: operation.c operation_functions.h
    $(gcc) $(-std=c99 -Wall) -c operation.c

operation_functions.o: operation_functions.c operation_functions.h
    $(gcc) $(-std=c99 -Wall) -c operation_functions.c

test: operation
    operation 7 5 10 15
    operation 0.57 0.9 3.5 9.12
    operation 0 -9 0 -3
    operation 0.467 13 0 -4
    operation 0 8 9 15
    operation 0 0 15 30
    operation 12 0 0 0

clean:
    rm -f *.o operation

这是我正在使用的makefile,当它运行时它表示在第3行看到的意外结束时我不确定它们是什么,并且会喜欢解释。

1 个答案:

答案 0 :(得分:1)

首先,检查所有缩进是真正的标签,而不是空格。为了愚蠢的历史原因,必须使用真正的标签。

接下来,$(-std=c99 -Wall)是个问题。 $(foo) is used to refer to the contents of a variable called foo。由于没有名为-std=c99 -Wall的变量,$(-std=c99 -Wall)将不会生成任何内容。

同样$(gcc)也可能是一个问题。除非您定义了gcc环境变量,否则它将为空。您可能只想要计划gcc。实际上你可能想要$(CC)这是一种选择合适的C编译器的跨平台方式。

$(CC) -std=c99 -Wall -o operation operation.o operation_functions.o

适当使用函数将所有C编译器标志放入变量中,然后使用该变量。这允许您从命令行覆盖它们。

由于默认标志列表通常是合理的,我喜欢使用+=所以我可以添加而不是覆盖我的C标志。例如CFLAGS=-pedantic make

我也有OPTIMIZE分开,所以我通常可以使用调试版本,但是然后为发布版本制作优化版本。 make OPTIMIZE=-O3。这是一个make参数,而不是一个环境变量,告诉make覆盖Makefile中的硬编码赋值。

OPTIMIZE = -g
CFLAGS += -std=c99 -Wall $(OPTIMIZE)

operation: operation.o operation_functions.o
    $(CC) $(CFLAGS) -o operation operation.o operation_functions.o