10

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

5 回答 5

5

错误:

ld: library not found for -lfl

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

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

locate libfl.a

操作系统

如果你没有它,你可以安装 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 安装莎士比亚:

brew install shakespeare -v

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

于 2013-11-29T11:07:38.093 回答
1

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

事实证明,libfl 中只定义了两个函数——mainyywrap. in libflmain几乎从未使用过,也yywrap可能不使用,因为它所做的只是 return 1

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

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

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

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

于 2015-04-12T06:25:06.093 回答
1

您想使用 command 运行名为“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

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

于 2013-04-17T12:18:50.517 回答
1

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

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

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

对此:

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

之后,再次尝试运行 make 并查看是否获得更好的结果。

于 2013-05-04T03:01:46.110 回答
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

解决方案

更改后我能够制作“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

(这里是如何获得brewhttp ://brew.sh )

于 2015-04-11T23:11:46.003 回答