0

私はフレックスがまったく初めてです。

flex を使用するとビルド エラーが発生します。つまり、flex を使用して .c ファイルを生成しました。実行すると、次のエラーが発生します。

1>lextest.obj : error LNK2001: unresolved external symbol "int __cdecl isatty(int)" (?isatty@@YAHH@Z)
1>C:\...\lextest.exe : fatal error LNK1120: 1 unresolved externals

これが私が使用しているlexファイルです(ここから取得):

/*** Definition section ***/

%{
/* C code to be copied verbatim */
#include <stdio.h>
%}

/* This tells flex to read only one input file */
%option noyywrap


%%
    /*** Rules section ***/

    /* [0-9]+ matches a string of one or more digits */
[0-9]+  {
            /* yytext is a string containing the matched text. */
            printf("Saw an integer: %s\n", yytext);
        }

.       {   /* Ignore all other characters. */   }

%%
/*** C Code section ***/

int main(void)
{
    /* Call the lexer, then quit. */
    yylex();
    return 0;
}

また、lex 構文コードに「main」関数を入れる必要があるのはなぜですか? 私が望むのは、yylex(); を呼び出せるようにすることです。別のcファイルから。

4

2 に答える 2

6

Q1 リンクエラー

isatty() 関数について何かが混乱しているように見えます。表示するコードには表示されませんが、flex によって生成されたコードで参照される可能性があります。その場合、C++ コンパイラでコンパイルしているように見えますが、isatty() 関数は C++ リンケージを持つ関数として扱われ、見つかりません。通常は C リンケージを持つ関数であり、次のように宣言する必要があります。extern "C" int isatty(int);C++ コードの ' '。

解決isatty()するには、生成された C に含まれているかどうかを追跡します。含まれている場合は、宣言されている場所も追跡します (その POSIX 標準ヘッダーは です<unistd.h>)。

Q2メイン

レクサーを含むファイルにメイン プログラムを配置する必要はありません。実際、多くの場合、それを行うことはありません。または、そこにあるメイン プログラムは、レクサーを分離してテストするために使用されるダミーにすぎません (条件付きでコードにコンパイルされるだけです - 内部#ifdef TEST / #endifまたは同等)。

それをしなければならないと思う理由は何ですか?

于 2010-04-14T06:09:28.270 に答える
-1

リンク エラーは、Windows で非 Windows ネイティブ バージョンの flex を使用しようとしているように見えますが、正しく動作していません。cygwin に付属しているバージョンの flex を使用する場合は、cygwin のコンパイラとリンカーを使用してプログラムをコンパイルおよびリンクする必要があります。

于 2010-04-14T06:22:19.517 に答える