如何在编译时为-lfl修复缺少的ld库?

时间:2013-04-17 02:23:44

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

我正在尝试将我的.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

5 个答案:

答案 0 :(得分:4)

错误:

  

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)

或者使用Homebrew安装莎士比亚:

brew install shakespeare -v

哪个应检测所有依赖项。

答案 1 :(得分:1)

您希望使用命令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

如果您想要更多信息,可以发表评论,希望这有助于(甚至有效)。

答案 2 :(得分:1)

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

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

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

到此:

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

在这样做之后,再次尝试运行make,看看你是否得到了更好的结果。

答案 3 :(得分:0)

实际上,我在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

的解决方案

我能够制作&#34; Makefile&#34;改变之后:

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

(以下是获取brewhttp://brew.sh

的方式

答案 4 :(得分:0)

问题是作者决定将他们的程序与几乎从不需要的无用的libfl库相关联,因此不包括在某些flex分发中(特别是MacOS上的那个)。

事实证明,libfl只定义了两个函数 - mainyywrap。 libfl中的main几乎从未使用过,而yywrap也可能不会被使用,因为它所做的就是返回1

事实证明,您可以轻松修复代码:

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

  2. 修改Makefile并从链接行中删除-lfl(只需搜索字符串-lfl并删除它们出现的4个字符)

    < / LI>

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