我需要编译一个包含多个源文件的Chicken Scheme项目,但我收到错误。如何编译多个Chicken Scheme文件?
根据the manual和this SO answer,我需要把(declare)
在我的来源。为什么编译器不能只是看到我正在导入另一个源超出了我,但是meh。
问题是,即使我把(declare)
写入,编译器也会抱怨(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
编译器说:
语法错误(进口):无法从不确定的模块导入
和
绑定变量:使用
如果我只是删除import
和use
声明为 “infinity.general” ,文件编译。不过,我有两个问题:
- 将产生的
.o
文件实际工作,在没有import
和use
条款?还是会抱怨在运行时丢失代码? csi
要求我的代码包含(import)
和(use)
声明,而csc
要求它没有声明。 但是,我要求我的代码在csi
和csc
中都可以使用!
我该如何解决这个问题?
但是,如果我省略了“加载”,解释器将如何知道在哪里可以找到我的包含? –
使用文件名作为单位名称的FYI是我的一个错字。我的意思是使用“无限一般”等等。 –
您可以使用'include'而不是'load',它在文件上将源文件包含在另一个文件的位置。它在解释器*和*编译器中工作。但我不确定你会这样做,因为它基本上与在C文件中使用'#include'other-file.c“'相同。另一种选择是只有在解释器中运行'cond-expand'才能'加载',否则将编译的对象链接在一起。 – sjamaan