【发布时间】:2020-05-10 11:59:25
【问题描述】:
在当前目录中,我有以下文件:
election.c election.h extended_map.c extended_map.h main.c test_utilities.c utilities.c utilities.h
另外,我在当前文件夹中有一个名为 mtm_map 的内部文件夹,其中包括 map.c map.h
我创建了一个运行良好的makefile:
make main.o
make extended_map.o
make election.o
make utilities.o
make clean
但运行时失败:
-bash-4.2$ make map.o
cc -c -o map.o map.c
map.c: In function ‘getIndexOfKey’:
map.c:36:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int i = 0; i < map->size; i++)
^
map.c:36:5: note: use option -std=c99 or -std=gnu99 to compile your code
map.c: In function ‘initializeElements’:
map.c:59:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int i=initial_index;i<last_index;i++)
^
map.c: In function ‘mapCopy’:
map.c:165:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int i = 0; i < map->size; i++)
^
map.c: In function ‘mapGet’:
map.c:239:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int i = 0; i < map->size; i++)
^
make: *** [map.o] Error 1
制作文件:
CC = gcc
OBJS = main.o ./mtm_map/map.o extended_map.o election.o utilities.o
EXEC = election
DEBUG_FLAG = -DNDEBUG
COMP_FLAG = -std=c99 -Wall -pedantic-errors -Werror
$(EXEC) : $(OBJS)
$(CC) $(DEBUG_FLAG) $(OBJS) -o $@
main.o: main.c ./mtm_map/map.h election.h test_utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
map.o: ./mtm_map/map.c ./mtm_map/map.h utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
extended_map.o: extended_map.c extended_map.h ./mtm_map/map.h utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
election.o: election.c election.h ./mtm_map/map.h extended_map.h utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
utilities.o: utilities.c utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
clean:
rm -f $(OBJS) $(EXEC)
关于如何解决这个问题的任何建议?请注意,我希望在当前目录中创建 map.o(而不是在 mtm_map 中)
【问题讨论】:
-
请阅读编译器消息。这是一个编译问题,而不是一个make错误。您的代码中有几个语法错误,这些消息很好地解释了
map.c文件中的问题(第 36 行) -
@LuisColorado 你读得不够仔细。问题不在于代码,问题在于编译行:它缺少所有编译器标志。特别是,它缺少
-c99编译器标志,该标志告诉编译器在编译代码时使用 ISO C99 标准。缺少编译器标志的原因是make使用其内置规则来创建目标文件,而不是生成文件中的规则。唯一可能的原因是,如果在运行 make 之前 OP 是cd'd 到mtm_map子目录中。 -
@AnttiHaapala
make将同时读取Makefile和makefile,因此名称的大小写不是问题。请参阅我的其他评论和我的回答。 -
@MadScientist,我已经仔细阅读了,我已经回答了这个问题。正如您所说,问题确实在makefile中,但我已经写了一个答案,我专注于那里的问题。 OP询问了makefile,但随后显示了一个简单文件的编译,该文件根本不使用
COMP_FLAG,所以他可能错误地命名了Makefile,或者他在不同的目录中。他正在使用默认规则将 map.c 编译成 map.o,他们使用CFLAGS,而不是COMP_FLAG。 -
您说您的代码中有几个语法错误。这不是真的。代码很好……它只是按照 C99 标准编写的。我已经在回答中解释了(可能)为什么会发生这种情况(从
mtm_map目录中运行make)。