Как связать lex.yy.c с main.c при помощи makefile? - PullRequest
0 голосов
/ 26 марта 2019

В main.c я вызываю функцию getToken, которая содержится в lex.yy.c, сгенерированном flex. Я хочу скомпилировать их, используя makefile

CC = gcc
TARGET = lexic

OBJS = util.o main.o

$(TARGET) : lex.yy.c util.o main.o
        $(CC) lex.yy.c -ll util.o main.o
util.o : globals.h util.h util.c
        $(CC) -c -o util.o util.c
main.o : globals.h util.h main.c
        $(CC) -o main.o main.c

Я сделал так, но компилятор не смог найти, где находится функция getToken.

Как я могу решить это?

1 Ответ

0 голосов
/ 27 марта 2019

Проблема в том, что вы не создаете объектный файл с именем 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...