Проблема в том, что вы не создаете объектный файл с именем main.o
, ваше правило пытается создать исполняемый файл с этим именем.
Простой и самый быстрый способрешить вашу проблему, добавив флаг -c
при сборке:
main.o : globals.h util.h main.c
$(CC) -c -o main.o main.c
# ^^
# Note flag added
«лучше» и, по крайней мере, проще - полагаться на неявные правила , который make
имеет для создания, среди прочего, объектных и исполняемых файлов.
Тогда вы могли бы просто сделать так, чтобы ваш Makefile
выглядел примерно так:
# CFLAGS is the C compiler flags
# Add flags to enable verbose warnings (always a good idea)
CFLAGS = -Wall -Wextra -pedantic
TARGET = lexic
# The libraries to link the target application with
LDLIBS = -ll
# By default the make program uses the first target
default: $(TARGET)
# Because of the implicit rules, make will be able to link the executable by itself
$(TARGET): lex.yy.o util.o main.o
# Also because of implicit rules, object files will be created automatically as well
# But we list them here to specify their header-file dependencies
util.o main.o: globals.h util.h
Важное примечание: неявное правило для файлов Lex (включая Flex) - создавать исходный файл X.c
из файла X.l
.Поэтому, если ваш Lex-файл не имеет имен lex.yy.l
, вам нужно изменить имя объектного файла lex.yy.o
в приведенном выше Makefile
.