快速加载和编译系统

Posted

技术标签:

【中文标题】快速加载和编译系统【英文标题】:Quickload and compile system 【发布时间】:2021-04-10 18:48:57 【问题描述】:

我是 Lisp 项目结构领域的新手,我在 Lisp 中处理了我的第一个更大的项目。这就是我从quickproject:make-project 制作的项目骨架开始的原因。在这之后,我的第一个想法是创建一个文件夹结构,但我不知道我到底想怎么做,所以我只是做了几个文件来拆分代码。

我将我的一些代码放在一个名为pixel.lisp 的文件中,一些放在gameview.lisp 中,主循环在pixelworld.lisp 中。

我的 asd 文件如下所示:

;;;; pixelworld.asd

(asdf:defsystem #:pixelworld
  :description "Describe pixelworld here"
  :author "Your Name <your.name@example.com>"
  :license  "Specify license here"
  :version "0.0.1"
  :serial t
  :depends-on (:sdl2 :cl-opengl)
  :components ((:file "package")
           (:file "pixel")
           (:file "gameview")
           (:file "pixelworld")))

如果我理解正确,这个文件应该告诉quickproject 当我ql:quickload 它时如何编译我的系统。因为:serialt 它应该按顺序编译。如果我从上到下手动编译和评估每个文件,这没有任何问题,因此依赖项没有问题。但是当我ql:quickload 项目并使用(in-package :pixelworld) 进入包时,我无法运行主函数,因为我系统中的其他表达式没有被评估。是否有一些我对此不了解的基本内容,或者是否有另一个命令我必须与 quicklisp 一起使用才能获得我想要的东西?提前致谢。 :)

【问题讨论】:

您的 asd 文件看起来不错,您是否在所有文件的顶部都有 (in-package :pixelworld)? main 定义在哪个文件中? 您可以定义一个在宏中使用的函数,然后以下列形式使用该宏(都在同一个文件中)。通过单独评估每个表格,一切正常。但是编译器无法访问宏在扩展代码时使用的辅助函数(它尚未定义,仅声明)。所以请注意编译过程中的警告和错误,可能通过调用 (asdf:compile-system :pixelworld) 或在调用 ql:quickload 时使用 :vervose t ;如果您在此问题中添加错误消息,我们可能会提供更多帮助 我同意@TravisSunderland:您可能缺少in-package 表格。这将导致无论*package* 在您所说的(load ...)(compile-file ...) 处,这就是正在加载/编译的文件中的内容。我希望 QL / ASDF 会将其重新绑定到 CL-USER 以使事情可重复,但这意味着您会发生不同的事情。 非常感谢,在每个文件中添加(包内:pixelworld)就可以了。感谢@tfb,我现在知道为什么了。如果我制作子文件夹并以这种方式构造我的代码,你们中的任何一个人是否也知道我必须做什么?我必须使用模块还是这些东西完全不同? @Echon:我认为这是另一个问题。如果我这样做,我会使用模块。 【参考方案1】:

就像 cmets 中提到的 Travis Sunderland 和 tfg 一样,在每个文件的顶部都有 (in-package :pixelworld) 很重要。更改后它完美无缺。

【讨论】:

以上是关于快速加载和编译系统的主要内容,如果未能解决你的问题,请参考以下文章

编译常量ClassLoader类系统类加载器深度探析

使用docker快速架构Android系统源码编译环境

怎么查看Linux下系统的内核,交叉编译,文件系统的版本?

Android.bp快速入门

高手进阶:Linux操作系统驱动编译与运行

无法加载JIT编译器(CLR.DLL):文件可能丢失或损坏,请重新检查或重新安装,请问这个问题怎么解决!