Common Lisp:独立的可执行文件和共享的 C 库
Common Lisp: standalone executable and shared C library
直到现在,我已经成功地将我的 Common Lisp 项目构建成一个独立的可执行文件,像这样:
(sb-ext:save-lisp-and-die "myexecutable" :toplevel #'main :executable t)
此外,我已经实现了从普通 lisp 调用编译到共享库中的 C 函数;像这样:
(cffi:define-foreign-library libtest
(:unix (:default "./libtest"))
(t (:default "./libtest")))
(cffi:use-foreign-library libtest)
或使用库的绝对路径。生成的可执行文件需要共享库 libtest.so。我在同一目录中同时拥有 myexecutable 和 libtest.so。但是,如果我使用绝对值,则无法分发这两个文件。如果我使用“./libtest”,当 运行 来自另一个目录时,它找不到库。
这个案例的处理方法是什么?
提前致谢!
像 sb-ext:*runtime-pathname*
这样的东西应该给你可执行文件的路径名。
* (describe '*runtime-pathname*)
SB-EXT:*RUNTIME-PATHNAME*
[symbol]
*RUNTIME-PATHNAME* names a special variable:
Value: #P"/usr/local/bin/sbcl"
Documentation:
The absolute pathname of the running SBCL runtime.
然后您可以计算同一目录中文件的路径名:
* (merge-pathnames "libtest" *runtime-pathname*)
#P"/usr/local/bin/libtest"
直到现在,我已经成功地将我的 Common Lisp 项目构建成一个独立的可执行文件,像这样:
(sb-ext:save-lisp-and-die "myexecutable" :toplevel #'main :executable t)
此外,我已经实现了从普通 lisp 调用编译到共享库中的 C 函数;像这样:
(cffi:define-foreign-library libtest
(:unix (:default "./libtest"))
(t (:default "./libtest")))
(cffi:use-foreign-library libtest)
或使用库的绝对路径。生成的可执行文件需要共享库 libtest.so。我在同一目录中同时拥有 myexecutable 和 libtest.so。但是,如果我使用绝对值,则无法分发这两个文件。如果我使用“./libtest”,当 运行 来自另一个目录时,它找不到库。
这个案例的处理方法是什么? 提前致谢!
像 sb-ext:*runtime-pathname*
这样的东西应该给你可执行文件的路径名。
* (describe '*runtime-pathname*)
SB-EXT:*RUNTIME-PATHNAME*
[symbol]
*RUNTIME-PATHNAME* names a special variable:
Value: #P"/usr/local/bin/sbcl"
Documentation:
The absolute pathname of the running SBCL runtime.
然后您可以计算同一目录中文件的路径名:
* (merge-pathnames "libtest" *runtime-pathname*)
#P"/usr/local/bin/libtest"