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)
错误:
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)
有关的:
或者使用 Homebrew 安装莎士比亚:
brew install shakespeare -v
Run Code Online (Sandbox Code Playgroud)
这应该检测您的所有依赖项。
您想使用命令运行名为“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
如果您想了解更多信息,可以发表评论,希望这会有所帮助(甚至有效)。