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

Sky*_*ler 9 compiler-construction dependencies compiler-errors bison flex-lexer

我试图将我的.spl文件转换为C文件(因为没有编译器).我有一个示例"Hello World".spl文件,我已经下载了莎士比亚编程语言 .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
Run Code Online (Sandbox Code Playgroud)

ken*_*orb 5

错误:

ld: library not found for -lfl

意味着您缺少作为flex library一部分的

要检查您是否已经安装了 flex 库,您可以使用 locate 来管理它:

locate libfl.a
Run Code Online (Sandbox Code Playgroud)

操作系统

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

brew install flex
Run Code Online (Sandbox Code Playgroud)

如果您仍然遇到问题,您可以尝试在 make 期间手动传递以下变量,例如:

LDFLAGS="-L/usr/local/Cellar/flex/*/lib" CPPFLAGS="-I/usr/local/Cellar/flex/*/include" make -f "Makefile"
Run Code Online (Sandbox Code Playgroud)

或者:

MAKEFLAGS="-j8 -L/usr/local/Cellar/flex/*/lib -I/usr/local/Cellar/flex/*/include" make -f "Makefile"
Run Code Online (Sandbox Code Playgroud)

最终通过修改DYLD_FALLBACK_LIBRARY_PATH环境。

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

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

有关的:

Linux

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

apt-get install flex
Run Code Online (Sandbox Code Playgroud)

有关的:


OS X(自制软件)

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

brew install shakespeare -v
Run Code Online (Sandbox Code Playgroud)

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


jon*_*tan 1

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

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

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

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

  • @Skyler `-lfl` 表示 `libfl.*`。您确定安装了“lex”(如 gnu flex 中的)吗?如果这样做,也许重新安装它会有所帮助?或者重新下载`libfl.*`?您可以搜索“libfl-dev”来找到它。或者只是[重新下载 lex](http://flex.sourceforge.net/)。 (2认同)