【问题标题】:How to fix a missing ld library for -lfl while compiling?如何在编译时为 -lfl 修复丢失的 ld 库?
【发布时间】:2013-04-09 15:27:34
【问题描述】:

我正在尝试将我的 .spl 文件翻译成 C 文件(因为没有编译器)。我有一个示例“Hello World”.spl 文件,我已经下载了 Shakespeare Programming Language .tar 并将其解压缩,但我不知道下一步该做什么。我似乎在任何文档中都找不到说明。有人可以帮忙吗?

编辑:

当我输入 make -f "Makefile" 时,我得到以下输出:

bison --verbose -d grammar.y
gcc -O2 -Wall -c grammar.tab.c
gcc -O2 -Wall -c makescanner.c
gcc makescanner.o -O2 -Wall -o makescanner
./makescanner include > scanner.l
flex -Cem -t scanner.l > scanner.c
scanner.l:600: warning, rule cannot be matched
gcc -O2 -Wall -c scanner.c
<stdout>:5823: warning: ‘yyunput’ defined but not used
gcc -O2 -Wall -c strutils.c
gcc grammar.tab.o scanner.o strutils.o -O2 -Wall -lfl -o spl2c
ld: library not found for -lfl
collect2: ld returned 1 exit status
make: *** [spl2c] Error 1

【问题讨论】:

    标签: compiler-errors compiler-construction dependencies bison flex-lexer


    【解决方案1】:

    错误:

    ld: library not found for -lfl

    表示您缺少属于flex library 的库。

    要检查你是否已经安装了 flex 库,你可以使用 locate:

    locate libfl.a
    

    OSX

    如果你没有,你可以安装 install flex(如果你使用的是brew):

    brew install flex
    

    如果还是有问题,可以尝试在make的时候手动传递以下变量,例如:

    LDFLAGS="-L/usr/local/Cellar/flex/*/lib" CPPFLAGS="-I/usr/local/Cellar/flex/*/include" make -f "Makefile"
    

    或:

    MAKEFLAGS="-j8 -L/usr/local/Cellar/flex/*/lib -I/usr/local/Cellar/flex/*/include" make -f "Makefile"
    

    最终通过修改DYLD_FALLBACK_LIBRARY_PATH环境。

    执行brew --env可以查看通过了哪个环境。

    注意:请确保根据您的环境更改路径。

    相关:

    Linux

    在最流行的 Linux 发行版上,您可以通过以下方式安装它:

    apt-get install flex
    

    相关:


    OS X(自制)

    或者使用 Homebrew 来安装 Shakespeare:

    brew install shakespeare -v
    

    这应该检测您的所有依赖项。

    【讨论】:

      【解决方案2】:

      您想使用命令make -f "Makefile" 运行名为“Makefile”的文件,并且如果您有这些命令 ar gcc flex ranlib tar bison 在您的终端中,您应该没问题。
      您可以通过在终端中输入命令名称和--help 来测试您是否有命令。

      然后您可以使用spl2c(现在已出现在您的 SPL 文件夹中)与您的代码一起制作一个 .c 文件,然后您可以使用 spl.h 将其放入 gcc 以制作一个 .o 文件,您终于可以使用 libspl.a 再次将其放入 gcc 以制作最终的编译程序。

      以防万一,将文件放入gcc,如下所示:
      第一关:gcc programname.c spl.h -o programname.o
      第二遍:gcc programname.o libspl.a -o compiledprogramname

      如果您想了解更多信息,可以发表评论,希望这会有所帮助(甚至有效)。

      【讨论】:

      • 请参阅原始帖子中的编辑。底线是当我在运行 make -f "Makefile" 后键入 spl2c 时,我得到一个 "Command not found" 错误。
      • @Skyler -lfl 表示libfl.*。你确定你已经安装了lex(如在 gnu flex 中)?如果你这样做,也许重新安装它会有所帮助?还是重新下载libfl.*?您可以搜索libfl-dev 找到它。或者只是redownload lex
      • 好的。我有 spl2c 工作。在我运行 ./spl2x hello.c 后,我运行 gcc hello.c,我得到“致命错误:spl.h:没有这样的文件或目录”。我尝试将语句#include 更改为#include "spl.h",但随后出现几个错误,例如“未定义对'global_initialize' 的引用”和“未定义对'initialize_character' 的引用”。有什么想法吗?
      【解决方案3】:

      如果您使用的是 Mac,显然 OSX 不包含 flex 所需的库,这就是导致错误的原因:library not found for -lfl

      但是,您应该可以使用等效的替换,您只需要更改 Makefile 中的一行。你应该改变这一行:

      $(CC) $^ $(CCFLAGS) -ll -o $@
      

      到这里:

      $(CC) $^ $(CCFLAGS) -lfl -o $@
      

      完成后,再次尝试运行 make 并查看是否有更好的结果。

      【讨论】:

      • 查看我对上述答案的最新评论,也许您可​​以提供帮助?谢谢
      【解决方案4】:

      问题在于,作者决定将他们的程序与大部分无用的 libfl 库链接,该库几乎不需要,因此不包含在某些 flex 发行版中(尤其是 MacOS 上的那个)。

      原来 libfl 只定义了两个函数——mainyywrap。 libfl 中的 main 几乎从未使用过,yywrap 也可能不会使用,因为它所做的只是返回 1

      事实证明你可以很容易地修复代码:

      1. 编辑文件include/user_code_top.metaflex并将%option noyywrap行添加到末尾。

      2. 编辑Makefile并从链接行中删除-lfl(只需搜索字符串-lfl并删除这4个字符)

      现在您应该能够构建它(尽管您可能需要删除文件 scanner.l 如果您之前运行过 make 并遇到了失败,因为 Makefile 无法检测到它需要在编辑 metaflex 文件后重新构建)。

      【讨论】:

        【解决方案5】:

        实际上,我在 OS X Yosemite 上遇到了同样的问题。

        make -f "Makefile"
        bison --verbose -d grammar.y
        gcc -O2 -Wall -c grammar.tab.c
        grammar.y:915:42: warning: illegal character encoding in string literal
              [-Winvalid-source-encoding]
          ...converter by Jon <C5>slund and Karl Hasselstr<F6>m.           *\n");
                              ^~~~                        ~~~~
        1 warning generated.
        gcc -O2 -Wall -c makescanner.c
        gcc makescanner.o -O2 -Wall -o makescanner
        ./makescanner include > scanner.l
        flex -Cem -t scanner.l > scanner.c
        scanner.l:600: warning, rule cannot be matched
        gcc -O2 -Wall -c scanner.c
        <stdout>:5822:17: warning: unused function 'yyunput' [-Wunused-function]
            static void yyunput (int c, register char * yy_bp )
                        ^
        <stdout>:5867:16: warning: function 'input' is not needed and will not be
              emitted [-Wunneeded-internal-declaration]
            static int input  (void)
                       ^
        2 warnings generated.
        gcc -O2 -Wall -c strutils.c
        gcc grammar.tab.o scanner.o strutils.o -O2 -Wall -lfl -o spl2c
        ld: library not found for -lfl
        clang: error: linker command failed with exit code 1 (use -v to see invocation)
        make: *** [spl2c] Error 1
        

        解决方案

        更改后我能够制作“Makefile”:

        spl2c: grammar.tab.o scanner.o strutils.o
          $(CC) $^ $(CCFLAGS) -lfl -o $@
        

        spl2c: grammar.tab.o scanner.o strutils.o
          $(CC) $^ $(CCFLAGS) -ll -o $@
        

        与此同时,我安装了 flex 库,但我不确定它是否有帮助。如果我的解决方案在没有 flex 库的情况下无法运行,您可以使用以下命令简单地安装它:

        brew install flex
        

        (这里是获取brew的方法:http://brew.sh

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多