首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Gambit-C编译方案

使用Gambit-C编译方案
EN

Stack Overflow用户
提问于 2019-11-06 21:32:59
回答 2查看 996关注 0票数 3

我正在运行Ubuntu18.04,我安装了gambc来执行Scheme脚本。gsi工作正常,可以解释我提供的任何文件,REPL也按预期工作。

不幸的是,我不知道如何使用gsc

伽比特几乎没有提供关于如何使用gsc编译程序的信息,man gsc更多地是关于gsi的,并且没有涵盖所有可用的选项(例如,在man页面中没有提到选项-o-c ),而且我可以找到的所有其他来源都不适合我。

让我详细说明最后一部分:

代码语言:javascript
复制
$ cat hello.scm
;#!/usr/local/bin/gsi-script -:d0
;
(define hello-world
        (lambda ()
                (begin (write `Hello-World) (newline) (hello-world))))

(define (main)
        (hello-world))

然后

代码语言:javascript
复制
$ gsc hello.scm
$ ls
hello.o1  hello.scm
$ ./hello.o1
Segmentation fault (core dumped)

失败,也是如此

代码语言:javascript
复制
$ gsc -c hello.scm
$ ls
hello.c hello.scm
$ gcc -o hello hello.c
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o : In function « _start » :
(.text+0x20) : Undefined reference to « main »
/tmp/ccnDUVi0.o : [30 more lines]
collect2: error: ld returned 1 exit status
  • 正在做什么
代码语言:javascript
复制
/* File: "m1.c" */
int power_of_2 (int x) { return 1<<x; }

; File: "m2.scm"
(c-declare "extern int power_of_2 ();")
(define pow2 (c-lambda (int) int "power_of_2"))
(define (twice x) (cons x x))

; File: "m3.scm"
(write (map twice (map pow2 '(1 2 3 4)))) (newline)

$ gsc -c m2.scm        # create m2.c (note: .scm is optional)
$ gsc -c m3.scm        # create m3.c (note: .scm is optional)
$ gsc -link m2.c m3.c  # create the incremental link file m3_.c

$ gsc -obj m1.c m2.c m3.c m3_.c
m1.c:
m2.c:
m3.c:
m3_.c:
$ gcc m1.o m2.o m3.o m3_.o -lgambit -lm -ldl -lutil
$ ./a.out
((2 . 2) (4 . 4) (8 . 8) (16 . 16))

正如http://www.iro.umontreal.ca/~gambit/doc/gambit.html$ gsc -obj m1.c m2.c m3.c m3_.c上指出的那样,m3_.c没有被定义,即使忽略了这一点,它也在$ gcc m1.o m2.o m3.o m3_.o -lgambit -lm -ldl -lutil上再次失败,抱怨没有定义-lgambit。然而,该文档解释了-o-c选项的用法。

我会在这里停下来,但我确实尝试了另外两个教程,没有工作,我找不到他们了。

如果上述任何一种方法都可以修改为适合我使用,或者如果任何其他进程允许将脚本编译为可执行文件(即使是简单的1文件程序现在也足够了),我将非常感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-06 22:02:54

在您提到的Gambit手册的3. Gambit方案编译器部分中,有关于编译器和它所采用的所有选项的信息非常丰富的描述。

如果要将Scheme源文件hello.scm编译为可执行程序,请尝试:

代码语言:javascript
复制
gsc -exe hello

你不需要提供文件扩展。生成的可执行文件将具有与源文件相同的名称,无需扩展(so hello.scm -> hello)。

票数 3
EN

Stack Overflow用户

发布于 2019-11-07 18:25:00

这是我想出来的,以防其他人遇到同样的问题。

  • 尽管没有出现在man页面中,但-exe选项确实允许创建可执行文件。
代码语言:javascript
复制
$ gsc -exe hello.scm
$ ./hello
Hello, World!

它的使用在Gambit,一种可移植的方案实现中解释,但不是在“Gambit Scheme Compiler”一节!相反,您将不得不回滚到前面的段落。

  • 正如@rsm所指出的,$ gsc -exe hello也能工作:即使已经编译了hello,也不需要.scm,但是有一个特定的命令序列会导致这个命令失败。

这是可行的(正确编译了h):

代码语言:javascript
复制
$ ls
hello.scm
$ gsc -exe -o h hello
$ ls
h  hello.scm

这是可行的(h是从hello.scm正确编译而不是从hello编译的):

代码语言:javascript
复制
$ ls
hello  hello.scm
$ gsc -exe -o h hello
$ ls
h  hello  hello.scm

但这是失败的:

代码语言:javascript
复制
$ ls
hello.scm
$ gsc -c hello.scm
$ ls
hello.c  hello.scm
$ gsc -exe -o h hello
hello_.o:(.data.rel+0x110) : undefined reference to « ____20_hello »
collect2: error: ld returned 1 exit status
*** ERROR IN ##main -- C link failed while linking "/home/hello_.o"
$ ls
hello_.c  hello.c  hello_.o  hello.scm

在同名.c文件已经存在的情况下,应该使用.scm扩展名。虽然消息提示链接器错误,但问题的根源是--据我所知--在未指定扩展名时C文件优先于Scheme文件,这对于Scheme编译器来说是意外的.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58738811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档