在 quicklisp 项目上使用 buildapp 时如何修复 asdf 错误

Posted

技术标签:

【中文标题】在 quicklisp 项目上使用 buildapp 时如何修复 asdf 错误【英文标题】:How to fix asdf error when using buildapp on a quicklisp project 【发布时间】:2019-12-27 03:22:27 【问题描述】:

我最近一直在制作我的第一个 quicklisp 项目,我想分享它。我已经将it 放在了 github 上,但并不是每个人都安装了 emacs + slime + quicklisp,所以我想制作一个可以与代码一起放入的可执行文件。

为此,我使用buildapp 并遵循this *** 答案中列出的步骤。

$ sbcl --no-userinit --no-sysinit --non-interactive \
       --load ~/quicklisp/setup.lisp \
       --eval '(ql:quickload "ltk-colorpicker")' \
       --eval '(ql:write-asdf-manifest-file "quicklisp-manifest.txt")'

$ buildapp --output out \
           --manifest-file quicklisp-manifest.txt \
           --load-system ltk-colorpicker \
           --entry colorpicker

运行这些命令后,我收到以下错误:

Fatal INPUT-ERROR-IN-LOAD:
  READ error during LOAD:

    The symbol "*SYSTEM-DEFINITION-SEARCH-FUNCTIONS*" is not external in the ASDF/FIND-SYSTEM package.

      Line: 16, Column: 90, File-Position: 15267

      Stream: #<SB-INT:FORM-TRACKING-STREAM for "file /home/nathan/quicklisp/local-projects/ltk-colorpicker/dumper-2SKVI5f7.lisp" 1001B70F83>

这里的主要问题是我什至不知道如何开始修复它。我见过this gibhub 问题,但这与 Homebrew 的问题有关,它甚至从未提及buildapp。这一切都非常令人困惑。我希望我能得到一些帮助。

提前感谢您的任何回答。

【问题讨论】:

你提到的 github 问题 确实 提到了 buildapp,在我看来,问题在于 ASDF 和 buildapp 之间缺少向后兼容性。也许您需要更新版本的 buildapp(或从源代码构建)。 仅供参考,您没有使用 buildapp 来构建可执行文件。我们可以使用asdf:make,见lispcookbook.github.io/cl-cookbook/scripting.html#with-asdf和ps:我要求截图:) 【参考方案1】:

我可以重现错误。按照 cmets 中的建议,您可以按如下方式构建 buildapp 的最新版本:

$ sbcl
* (ql:quickload :buildapp)
...

* (buildapp:build-buildapp 
    (merge-pathnames "bin/buildapp" (user-homedir-pathname)))

这个版本$HOME/bin/buildapp。当我使用新的二进制文件时,没有错误了。

您还可以通过从 Common Lisp 系统地调用 buildapp::main 函数来避免生成可执行文件(最终可能会过时);然后,您将始终拥有与 quicklisp 的当前版本相对应的版本:

* (buildapp::main 
    '("BUILDAPP" ;; argv[0] must exist but the value is not important
      "--manifest-file" "/tmp/quicklisp-manifest.txt" 
      "--load-system" "drakma" "--output" "/tmp/test"))

【讨论】:

【参考方案2】:

我的一些额外信息:

解决方案是使用@coredump 提到的最新版本的buildapp。我通过转到github page 进行更新,下载 zip 并在存储buildapp 的位置执行以下命令。

$ make
$ cp buildapp /usr/bin

(这当然只适用于 linux。) 这不是一个优雅的解决方案,但buildapp 已经 4 年没有更新了,我认为这是一个足够安全的赌注。我的命令也出错了。 --entry 部分是错误的。它应该是:`--entry ltk-colorpicker::main`` 其中 main 是一个接受一个变量的函数,因为这是 spec 所要求的。

主要就是这样:(main (i) (declare (ignore i)) (colorpicker))

【讨论】:

以上是关于在 quicklisp 项目上使用 buildapp 时如何修复 asdf 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 quicklisp 中升级 asdf 版本?

如何使用 quicklisp 更新依赖项?

无法将 quicklisp 与 clozure-cl 一起使用

如何让 Emacs/Slime/SBCL 识别 quicklisp 包

如何获取 Quicklisp 提供的每个系统的所有依赖项列表?

重新定义已删除的包(Common Lisp)