首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编译多个鸡方案文件?

如何编译多个鸡方案文件?
EN

Stack Overflow用户
提问于 2016-08-16 01:03:44
回答 1查看 865关注 0票数 5

我需要编译一个包含多个源文件的小鸡计划项目,但是我得到了错误。

根据手册这就是答案的说法,我需要把(declare)放在我的来源中。为什么编译器不能仅仅看到我正在导入另一个源,但这是我无法理解的。

问题是,即使我把(declare)放进去,编译器也会抱怨(import)(use)

infinity.filesystem.scm:

代码语言:javascript
复制
(use bindings filepath posix)
(declare (uses infinity.general.scm))
(load-relative "infinity.general.scm")

(module infinity.filesystem (with-open-file make-absolute-path with-temporary-directory with-chdir)
 (import scheme filepath posix infinity.general)
 (begin-for-syntax
  (use bindings chicken)
  (import infinity.general))

 ...etc...

infinity.general.scm:

代码语言:javascript
复制
(declare (unit infinity.general.scm))
(require-extension srfi-1 srfi-13 format data-structures ansi-escape-sequences basic-sequences)
(module infinity.general (bind+ format-ansi repeat-string join-strings pop-chars! inc! dec!
                          take* drop* take-right* drop-right* ends-with? take-where)
 (import scheme chicken srfi-1 srfi-13 data-structures ansi-escape-sequences basic-sequences bindings ports format)

 ...etc...

命令:

代码语言:javascript
复制
$ csc -uses bindings.o -uses infinity.general.o -c infinity.filesystem.scm -o infinity.filesystem.o

编译器说:

语法错误(导入):无法从未定义模块导入

未绑定变量:使用

如果我只是删除“import”的use和infinity.general声明,文件就会编译。不过,我有两个问题:

  1. 在没有importuse子句的情况下,结果的use文件实际工作吗?还是会抱怨运行时缺少代码?
  2. csi要求我的代码包含(import)(use)声明,而csc要求它不包含。然而,csi i要求我的代码同时工作在 csc**!** 和中。

请问我怎么解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2016-08-16 06:51:14

为什么编译器不能仅仅看到我正在导入另一个源,但这是我无法理解的。

声明用于确定依赖关系:编译器需要知道调用特定toplevel的顺序(如果有的话),以确保在可以使用该单元的任何全局代码之前初始化正确的代码。当所有内容都是单独编译时,编译器将不知道何时插入对toplevel的调用。传递给-usescsc交换机是多余的:csc -uses foo相当于将(declare (uses foo))放入源代码中。据我所知,传递-uses foo.o文件 foo.o没有任何作用。

在您的代码片段中,您使用的是load,这不是在编译时包含代码的正确方式:load将在运行时读取和评估目标文件。相反,您应该完全忽略loaddeclare已经处理了依赖关系;您只需要将它们链接到一起即可。

此外,使用文件名作为模块/单元名称也不是很常见,尽管它应该可以工作。

如果我只是删除"infinity.general“的导入和使用声明,文件就会编译。不过,我有两个问题: 1)在没有导入和使用子句的情况下,生成的.o文件实际工作吗?还是会抱怨运行时缺少代码?

您需要保留import表达式,否则程序不应该编译。如果它确实编译了,就会有一些奇怪的事情发生。当您静态地将所有东西链接在一起时,您不需要use。如果您使用动态链接,您将得到一个运行时错误。

有关unbound variable: use的错误是因为您在begin-for-syntax块中使用了use。您可能只需要使用(import-for-syntax chicken),就像按照你另一个这样的问题那样。

2) csi要求我的代码包含(导入)和(使用)声明,而csc则要求它不包含。但是,我要求我的代码同时在csi和csc中工作!

看起来,您处理得太快了:您正在编写一个完整的程序,同时试图使它运行、编译和解释,而无需首先了解系统的工作原理。

此时,最好先对一个由两个文件组成的小项目进行实验。然后,您可以了解如何从解释器中的代码编译可执行文件。然后,利用这些知识来构建实际的程序。如果在任何时候有什么事情发生了变化,您总是可以回到最小的情况,找出您正在做的不同的事情。

这也将有助于获得支持,因为您将能够提供一组完整但最少的文件,人们将能够更快地告诉您哪里出错了,或者您是否发现了bug。

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

https://stackoverflow.com/questions/38965168

复制
相关文章

相似问题

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