我需要编译一个包含多个源文件的 Chicken Scheme 项目,但我遇到了错误。
根据手册和这个 SO answer,我需要将(declare)
s 放入我的来源。为什么编译器不能只看到我正在导入另一个源代码超出了我的范围,但是嗯。
问题是,即使我把(declare)
s 放进去,编译器也会抱怨(import)
s 和(use)
s。
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
编译器说:
语法错误(导入):无法从未定义的模块导入
和
未绑定变量:使用
如果我只是删除“infinity.general”的import
和use
声明,文件就会编译。但是,我有两个问题:
- 在没有and子句的情况下,生成的
.o
文件会真正起作用吗?或者它会在运行时抱怨缺少代码?import
use
csi
要求我的代码包含(import)
和(use)
声明,而csc
要求它不包含。但是,我要求我的代码同时适用于csi
和csc
!
请问我该如何解决?