我使用的是SBCL,尽管我看到其他实现也有类似的功能。我可以转储一个不需要安装Lisp实现,但依赖于标准C库的可执行文件。我如何使转储的图像静态链接(即没有任何依赖关系)?
当我使用完一个图像后,我可以调用
(save-lisp-and-die "image-name" :executable t)
这将在我的目录中留下一个名为image-name
的文件,然后我可以用./image-name
调用。我将被放入一个repl中,并且我在saving-lisp-an-dying之前所做的一切都将仍然存在。我的问题是,当我将此文件移动到另一台机器时,我无法运行它。要么我得到'file not found'错误,或者我被告知安装了错误的GLIBC版本。在映像上运行file
显示它是动态链接的。有没有一种方法可以转储静态链接的映像,我可以直接复制到任何具有Linux内核的机器上?
2条答案
按热度按时间gdx19jrr1#
生成动态链接的可执行文件
然后使用其中一个differents ways to generate a statically linked executable from a dynamically linked executable。
我试过packelf.sh,它工作得很好!
sdnqo3pr2#
save-lisp-and-die
的一个很好的补充工具是Deploy。您遇到了什么样的“文件未找到”消息?Deploy有助于将外部库依赖项与二进制文件一起发布,例如libssl.so或libmagic.so,因此它们不需要与目标操作系统上的版本完全相同,或者根本不需要。
要使用它,您需要调整.asd声明并用途:
然后像往常一样用
(asdf:make :my-app)
构建二进制文件。Deploy会创建一个
bin/
目录,其中包含了你的二进制文件和依赖项。这就是你现在要发布的内容。应该可以将所有内容打包到一个可执行的归档文件中,但我还没有做到这一点。
更多信息:https://lispcookbook.github.io/cl-cookbook/scripting.html#with-deploy---ship-foreign-libraries-dependencies
我们实际上并没有使用libssl,所以我们告诉Deploy忽略它:
使用
(push :deploy-console *features*)
在启动时静默Deploy。