2016-10-05 78 views
3

到现在为止,我已成功地建立我的Common Lisp的项目到一个独立的可执行文件SBCL是这样的:Common Lisp的:独立的可执行文件和共享C库

(sb-ext:save-lisp-and-die "myexecutable" :toplevel #'main :executable t) 

而且,我已调用C函数,从普通的lisp编译成共享库;像这样:

(cffi:define-foreign-library libtest 
     (:unix (:default "./libtest")) 
     (t (:default "./libtest"))) 

(cffi:use-foreign-library libtest) 

或使用库的绝对路径。生成的可执行文件需要共享库libtest.so。我的myexecutable和libtest.so都在同一个目录下。但是,如果我使用绝对,我不能分发这两个文件。如果我使用“./libtest”,则从其他目录运行时找不到该库。

这种情况下的方法是什么? 提前谢谢!

+0

你为什么不能重新分配使用绝对路径? –

+0

假设我放入“/ home/me/src/my-project”,然后写入lisp文件。当我分发这两个文件时,不知何故应该用新路径的知识更新lisp文件。我如何实现这一目标? – Dimitris

+0

尽管我认为库通常放在一个系统范围内(例如linux上的'/ usr/lib'),为什么不能只使用相对路径呢? –

回答

5

类似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" 
+0

非常感谢!这是我正在寻找的。 – Dimitris