12

こんにちは、Lex と yacc を学んでいます。次のlexプログラムを作成しました。

%{
#include <stdio.h>
%}

%%
[0123456789]+           printf("NUMBER\n");
[a-zA-Z][a-zA-Z0-9]*    printf("WORD\n");
%%

次のコマンドを使用して実行しようとしています。

  1. レックスの例1.l
  2. cc lex.yy.c -o example1 -ll

cc lex.yy.c -o example1 -lfl も試しました

上記の 2 番目のコマンド フォームを入力すると、次のエラーが表示されます。

D:\workdir\flexyacc\Test3>gcc lex.yy.c -o Test -lfl
C:\Dev-Cpp\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lfl
collect2: ld returned 1 exit status

このエラーをグーグルで検索してみましたが、今のところうまくいきません。私は Lex プログラミングが初めてなので、これを修正する方法がわかりません。どんな助けでも大歓迎です。よろしくお願いします。

4

8 に答える 8

9

lex + yacc を使用している場合、yywrap 関数を定義する場合、または noyywrap オプションを使用する場合は、-lfl を削除できます。

%option noyywrap
%%
 ...
%%
于 2015-02-03T14:12:03.070 に答える
7

lex コードをコンパイルするには、まずマシンに flex をインストールしておく必要があります。その場合、ファイル libfl.a があります。私のマシンでは、'C:\GnuWin32\lib' に flex をインストールしました。

gcc lex.yy.c -L"C:\GnuWin32\lib" -lfl

于 2013-04-05T21:42:35.683 に答える
6

私は同じ問題に遭遇したので、インターネットでチェックアウトし、2011 年 6 月 3 日 6:44 PM に投稿された workingcaptchabypass によって解決策を見つけました

彼は言った:

代わりにこの関数を追加して、正常にコンパイルできます

yywrap()
{
}

そのため、メイン関数の前に .lex ファイルにコードを提供しました。それをした後、それは本来あるべき方法でうまくいきました:)

于 2012-09-07T11:42:54.287 に答える
2

MinGW を使用して TXR を Windows に移植するときに、この問題に遭遇しました。

MinGW にはそれ自体のフレックス ライブラリがありますが、それを環境にエクスポートしません。

こちらをご覧ください: http://lists.nongnu.org/archive/html/txr-users/2011-10/msg00001.html

-L/usr/lib回避策は、 beforeを使用すること-lflです。しかし、これについて考えてみてください。これはハックです。なんで?パス/usr/lib/は、コンパイル環境のランタイムである MinGW に属しているためです。

/usr/libビルド中の Windows プログラムのライブラリをツールチェーンが検索する場所ではありません (これは、ライブラリ検索パスにありません!)

つまり、クロスコンパイル ジョブでビルド マシンのネイティブ ライブラリを効果的に盗んでいます。

これは、たとえば、Ubuntu で Fedora プログラムをクロスコンパイルしていて、Fedora クロス ツールチェーンで欠落している Ubuntu の静的ライブラリに自分自身を助けているよう/usr/libなものです (アーキテクチャとオブジェクト ファイル形式が発生するという事実を利用して)同じであること)。

これは間違いなく、MingW で Flex を「パッケージ化」する方法のバグです。

于 2012-04-16T23:16:22.737 に答える
1

gccで-lflの代わりに-llを使用してみてください

于 2019-11-15T21:55:33.890 に答える
0

エラーの場合: cannot find -lflx

Makefile の変更: LEXLIB = -lflLEXLIB =.

-lflそれ以外の場合は、引数があれば削除します。

于 2014-04-14T22:42:28.343 に答える