Undefined ссылка на 'yylex()'

Я пытаюсь использовать flex и bison для создания простого языка сценариев. Прямо сейчас, я просто пытаюсь заставить калькулятор работать.

Я не могу его скомпилировать. Когда я запускаю этот make файл:

OBJECTS = hug.tab.o hug.yy.o
PROGRAM = hug.exe

CPP = g++
LEX = flex
YACC = bison

.PHONY: all clean

all: $(OBJECTS)
$(CPP) $^ -o $(PROGRAM)

clean:
$(RM) *.o *.output *.tab.* *.yy.* $(PROGRAM)

%.tab.o: %.tab.cpp
$(CPP) -c -o [email protected] $<

%.tab.cpp: %.ypp
$(YACC) -vd $<

%.yy.o: %.yy.c
$(CPP) -c -o [email protected] $<

%.yy.c: %.l
$(LEX) -o [email protected] $<

%.o: %.cpp
$(CPP) -c -o [email protected] $<

в моих .l и .ypp файлах, я получаю эту ошибку:

undefined reference to `yylex()'

И если я делаю команду для all следующим образом:

$(CPP) $^ -o $(PROGRAM) -lfl

он говорит, что не смог найти -lfl. И если я сделаю так:

$(CPP) $^ -o -lfl $(PROGRAM)

он возвращается к ошибке undefined reference.

Жаль, что я немного об этом не знаю.

EDIT: у меня установлен flex. Я попытался изменить его с -lfl на C:/GnuWin32/lib/libfl.a(я пытаюсь использовать Windows, потому что у Linux есть нечетные проблемы на моих компьютерах, и у меня пока нет Mac), но у него все еще есть такая же ошибка.

Ответ 1

Проблема заключается в том, что вы компилируете hug.yy.c с g++ (рассматривая его как С++) вместо gcc. Это файл, который определяет yylex, поэтому, скомпилировав его как С++, вы получите функцию yylex С++, в то время как другие файлы ищут функцию C yylex.

Попробуйте вставить extern "C" int yylex(); в первый раздел вашего файла hug.l, чтобы он использовал ссылку C для yylex вместо С++

Ответ 2

Установили ли вы библиотеку flex? если да, попробуйте что-то вроде

$(CPP) $^ /path/of/flex/lib/libfl.a -o $(PROGRAM)

Ответ 3

Я добавил файл с этим.

main ()
{
    return (yylex())

 }

Теперь это дает мне ошибку сегментации, но я могу связать ее.

Ответ 4

В этой ссылке упоминается очень краткое и последнее решение: https://lagunita.stanford.edu/courses/course-v1:Medicine+IPE21CC+ongoing/wiki/Engineering.Compilers.Fall2014/troubleshoot-liblibflso-undefined-reference- yylex/

В основном, выполните одно из следующих действий:

1.Добавив% option noyywrap в гибкий файл и удалив часть -lfl в команде, все будет в порядке.

2. # определить yylex, так как extern "C" тоже работает. Поскольку он предотвращает путаницу C++ с именем.

3. Установите flex-old, а не flex. flex-old bydefault решает проблему как решение 2, так что вам не нужно об этом беспокоиться.