Простейший пример, который у меня есть:
mylex.l
%option noyywrap
%%
: return ':';
%%
main.cpp
#include <stdio.h>
#include <iostream>
extern "C"
{
extern int yylex(void);
extern FILE* yyin;
}
int main()
{
yyin = fopen("plop", "r");
std::cout << yylex() << "\n";
}
Затем построить:
> flex -o mylex.c mylex.l
> gcc -c mylex.c
> g++ -c main.cpp
> g++ main.o mylex.o
Обратите внимание на gcc для компиляции mylex.c
Если вы скомпилируете mylex.c с помощью g ++, он будет скомпилирован как C ++ (не C), и ваши внешние объявления "C" в main будут неправильными. Таким образом, вам нужно скомпилировать mylex.c и main.cpp с разными компиляторами, а затем связать их вместе в отдельных шагах.
Версия 2:
В качестве альтернативы вы можете скомпилировать гибкий код как C ++ и удалить внешний "C" из main.
main.cpp
#include <stdio.h>
#include <iostream>
extern int yylex(void);
extern FILE* yyin;
int main()
{
yyin = fopen("plop", "r");
std::cout << yylex() << "\n";
}
Теперь постройте так:
> flex -o mylex.c mylex.l
> g++ -c mylex.c
> g++ -c main.cpp
> g++ main.o mylex.o
Обратите внимание, что в этот раз я использовал g ++ для компиляции mylex.c (который теперь можно назвать mylex.cpp).
Теперь, когда вы используете один и тот же компилятор, он может быть однострочным:
> flex -o mylex.c mylex.l
> g++ mylex.c main.cpp