在 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 与 clozure-cl 一起使用
如何让 Emacs/Slime/SBCL 识别 quicklisp 包