Неопределенная ссылка на 'yylex' - скомпилирована g++

Я пытаюсь сделать лексический анализатор, используя flex. Для удобства я хочу скомпилировать свой scanner.l в lex.yy.cc, а затем скомпилировать файл .cc командой: g++ lex.yy.cc -lfl.

-lfl обязателен. Затем g++ выдал мне следующее сообщение об ошибке: неопределенная ссылка на 'yylex' Вот краткий снимок моего scanner.l

%{
...
#include ...
extern "C" int yylex();
...
%}
...
%option c++
%option noyywrap

%%
/* rules */
%%

Я провел некоторое исследование, переполнение стека говорит, что это должно быть исправлено добавлением extern "C" int yylex();. Однако этого не произошло.

Я использую flex 2.6.4 на удаленной (из школы) Linux-машине.

Вам также нужно определение yylex. Сейчас у вас есть только декларация.

Ted Lyngmo 02.04.2023 15:57

Вы проверили содержимое lex.yy.c, чтобы убедиться, что yylex был сгенерирован?

john 02.04.2023 16:00

@TedLyngmo, я подумал, что flex должен дать мне определение.

林子嵎 02.04.2023 16:21

@john Нет, нет. Разве flex не должен помочь мне сгенерировать yylex?

林子嵎 02.04.2023 16:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TL;DR: удалить %option c++.


-lfl обязателен.

Вы уверены? libfl предоставляет только две функции: yywrap(), которые вам не нужны из-за

%option noyywrap

, и main(), которые вам не нужны, если вы предоставите свои main(). main() в libfl просто вызывает yylex() снова и снова, пока последний не сигнализирует об окончании ввода, что, безусловно, является причиной зависимости от yylex() в вашем случае.

Если у вас есть какое-то внешнее требование полагаться на libfl для вашей программы main, то вы выстрелили себе в ногу, указав

%option c++

. Этот вариант больше касается API, который будет предоставлять сгенерированный сканер, чем языка, который будет использоваться для его компиляции. Вам нужно скомпилировать как C++, если вы его используете, но вы все равно можете скомпилировать как C++, если вы этого не делаете. Вы должны опустить эту опцию, чтобы иметь yylex() в качестве точки входа сканера.

Объявление связи C для yylex() — это то, что вы делаете, если планируете опустить %option c++, скомпилировать с помощью компилятора C++ и связать с другим кодом (например, libfl), который ожидает интерфейс C для yylex(). Но это редко бывает выгодной комбинацией, потому что типы действий, которые должен выполнять типичный сканер, не сильно выигрывают от C++ по сравнению с C. Таким образом, если вы хотите, чтобы интерфейс C yylex(), то обычно чище просто напишите действия на C и скомпилируйте сканер с помощью компилятора C. И, конечно же, вы все еще можете вызывать это из C++, если хотите.

Чтобы уточнить, я имел в виду, что это требуется ТА.

林子嵎 02.04.2023 16:32

Спасибо, это исправлено. lex,yy.c теперь скомпилирован g++ отлично.

林子嵎 02.04.2023 16:33

Другие вопросы по теме