Common Lisp库中仅make-json函数无法导出问题求助
问题
我在用Common Lisp创建库时遇到了异常,库代码及依赖项目代码如下:
库文件内容
; in my-lib.asd (asdf:defsystem :my-lib :depends-on (:cl-json :clsql :clsql-sqlite3) :components ((:file "package") (:file "functions") (:file "macros")))
; in package.lisp (defpackage :my-lib (:import-from :cl-json :encode-json-to-string) (:use :cl) (:export :use-db :make-json :cwd :status-update))
; in functions.lisp (in-package :my-lib) .... (defun make-json (a-list) (encode-json-to-string a-list)) (defun change-to-path (project-name) (uiop:chdir (merge-pathnames project-name "~/quicklisp/local-projects/"))) (defun cwd () (uiop/os:getcwd)) .....
依赖该库的项目代码
;; in project.asd (asdf:defsystem :project :depends-on (:dexador :clsql :clsql-sqlite3 :my-lib :cl-csv :uiop)
;; in package.lisp (defpackage :project (:shadowing-import-from :cl-csv :read-csv) (:use :cl :my-lib))
当前问题:
- 持续收到错误提示:
The symbol "MAKE-JSON" is not external in the MY-LIB package - 其他导出的函数均可正常使用,仅
make-json无法被识别为外部符号 - 查看my-lib外部符号列表时,确实没有
make-json:
(do-external-symbols (s (find-package 'my-lib))
(print s))MY-LIB:STATUS-UPDATE
MY-LIB:REM-VAR
MY-LIB:CWD
MY-LIB:CHANGE-TO-PATH
NIL
更新信息:只有手动编译my-lib的defpackage代码时,make-json才会被加入导出列表;使用(asdf:load-asd "my-lib")加载系统仍会报错。
原因分析与解决方法
核心原因
- ASDF缓存未更新:ASDF会缓存系统定义和编译后的文件,若修改
package.lisp的导出列表后未重新编译整个系统,ASDF会继续使用旧缓存,导致新添加的make-json不被识别。 load-asd仅加载系统定义:(asdf:load-asd "my-lib")只是读取.asd文件的系统配置,不会编译或加载package.lisp、functions.lisp等组件文件,修改后的导出规则自然不会生效。
解决步骤
强制重新编译加载整个系统:
执行以下命令,让ASDF重新处理所有文件并更新缓存:(asdf:load-system :my-lib :force t)其中
:force t参数会强制ASDF重新编译所有依赖文件,确保新的导出列表被应用。清理编译缓存(可选):
如果强制加载仍无效,可手动清理my-lib的编译缓存:- 找到缓存目录(通常在
~/.cache/common-lisp/<你的Lisp实现>/<系统路径>下) - 删除该目录下my-lib相关的文件,再重新执行
(asdf:load-system :my-lib :force t)。
- 找到缓存目录(通常在
验证导出状态:
加载系统后,重新执行外部符号检查命令,确认make-json已被导出:(do-external-symbols (s (find-package 'my-lib)) (print s))更新依赖项目:
确保依赖my-lib的project系统也被重新加载,避免使用旧缓存:(asdf:load-system :project :force t)
内容的提问来源于stack exchange,提问作者Vinn
相关产品推荐
相关产品推荐

