我需要编译一个包含多个源文件的 Chicken Scheme 项目,但是我遇到了错误。
根据手册和这个 SO 回答,我需要在我的源代码中放置
问题是,即使我已经添加了
infinity.filesystem.scm:
根据手册和这个 SO 回答,我需要在我的源代码中放置
(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
声明,文件就可以编译。但是,我有两个问题:
- 在缺少
import
和use
子句的情况下,生成的.o
文件是否实际可用?还是会在运行时抱怨缺少代码? csi
要求我的代码包含(import)
和(use)
声明,而csc
则要求不包含。 然而,我需要我的代码在csi
和csc
中都能正常工作!
请问我该如何解决这个问题?
load
,解释器怎么知道在哪里找到我的包含文件呢? - Sod Almightyinclude
而不是load
,它会在另一个文件的位置文本地包含源文件。它适用于解释器和编译器。但我不确定你是否想这样做,因为这基本上与在 C 文件中使用#include "other-file.c"
相同。另一个选项是使用cond-expand
,只有在解释器中运行时才进行load
,否则将编译对象链接在一起。 - sjamaan