我需要编译一个包含多个源文件的小鸡计划项目,但是我得到了错误。
根据手册和这就是答案的说法,我需要把(declare)放在我的来源中。为什么编译器不能仅仅看到我正在导入另一个源,但这是我无法理解的。
问题是,即使我把(declare)放进去,编译器也会抱怨(import)和(use)。
infinity.filesystem.scm:
(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:
(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...命令:
$ csc -uses bindings.o -uses infinity.general.o -c infinity.filesystem.scm -o infinity.filesystem.o编译器说:
语法错误(导入):无法从未定义模块导入
和
未绑定变量:使用
如果我只是删除“import”的use和infinity.general声明,文件就会编译。不过,我有两个问题:
import和use子句的情况下,结果的use文件实际工作吗?还是会抱怨运行时缺少代码?csi要求我的代码包含(import)和(use)声明,而csc要求它不包含。然而,csi i要求我的代码同时工作在 csc**!** 和中。请问我怎么解决这个问题?
发布于 2016-08-16 06:51:14
为什么编译器不能仅仅看到我正在导入另一个源,但这是我无法理解的。
声明用于确定依赖关系:编译器需要知道调用特定toplevel的顺序(如果有的话),以确保在可以使用该单元的任何全局代码之前初始化正确的代码。当所有内容都是单独编译时,编译器将不知道何时插入对toplevel的调用。传递给-uses的csc交换机是多余的:csc -uses foo相当于将(declare (uses foo))放入源代码中。据我所知,传递-uses foo.o对文件 foo.o没有任何作用。
在您的代码片段中,您使用的是load,这不是在编译时包含代码的正确方式:load将在运行时读取和评估目标文件。相反,您应该完全忽略load:declare已经处理了依赖关系;您只需要将它们链接到一起即可。
此外,使用文件名作为模块/单元名称也不是很常见,尽管它应该可以工作。
如果我只是删除"infinity.general“的导入和使用声明,文件就会编译。不过,我有两个问题: 1)在没有导入和使用子句的情况下,生成的.o文件实际工作吗?还是会抱怨运行时缺少代码?
您需要保留import表达式,否则程序不应该编译。如果它确实编译了,就会有一些奇怪的事情发生。当您静态地将所有东西链接在一起时,您不需要use。如果您使用动态链接,您将得到一个运行时错误。
有关unbound variable: use的错误是因为您在begin-for-syntax块中使用了use。您可能只需要使用(import-for-syntax chicken),就像按照你另一个这样的问题那样。
2) csi要求我的代码包含(导入)和(使用)声明,而csc则要求它不包含。但是,我要求我的代码同时在csi和csc中工作!
看起来,您处理得太快了:您正在编写一个完整的程序,同时试图使它运行、编译和解释,而无需首先了解系统的工作原理。
此时,最好先对一个由两个文件组成的小项目进行实验。然后,您可以了解如何从解释器中的代码编译可执行文件。然后,利用这些知识来构建实际的程序。如果在任何时候有什么事情发生了变化,您总是可以回到最小的情况,找出您正在做的不同的事情。
这也将有助于获得支持,因为您将能够提供一组完整但最少的文件,人们将能够更快地告诉您哪里出错了,或者您是否发现了bug。
https://stackoverflow.com/questions/38965168
复制相似问题