我正在尝试将我的.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
答案 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
相关:
或者使用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
(以下是获取brew
:http://brew.sh)
答案 4 :(得分:0)
问题是作者决定将他们的程序与几乎从不需要的无用的libfl库相关联,因此不包括在某些flex分发中(特别是MacOS上的那个)。
事实证明,libfl只定义了两个函数 - main
和yywrap
。 libfl中的main
几乎从未使用过,而yywrap
也可能不会被使用,因为它所做的就是返回1
。
事实证明,您可以轻松修复代码:
编辑文件include/user_code_top.metaflex
并将行%option noyywrap
添加到结尾。
修改Makefile
并从链接行中删除-lfl
(只需搜索字符串-lfl
并删除它们出现的4个字符)
现在你应该能够构建它了(尽管你之前运行make并且失败了,你可能需要删除文件scanner.l
,因为Makefile在编辑之后无法检测到需要重建它。 metaflex文件)。