Fib*_*sky 10 binaryfiles swi-prolog
我想在没有安装prolog的机器上运行swi-prolog程序(实际上是服务器).
序言代码swipl_test.pl:
main :- write('Hello, world\n').
Run Code Online (Sandbox Code Playgroud)
在本地机器4.4.0-64-generic #85~14.04.1-Ubuntu SMP Mon Feb 20 12:10:54 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux制作二进制hello有SWI-Prolog version 7.2.3 for amd64:
swipl --goal=main --toplevel=halt --stand_alone=true --foreign=save -o hello1 -c swipl_test.pl
Run Code Online (Sandbox Code Playgroud)
移动hello远程计算机2.6.32-5-amd64 #1 SMP Wed Jun 17 16:09:06 UTC 2015 x86_64 GNU/Linux会出现以下错误:
error while loading shared libraries: libswipl.so.7.2: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
如何从prolog代码中准备一个自包含的二进制文件?我在远程计算机上没有sudo权限.
小智 1
我遇到了同样的问题,我可以通过寻找执行程序所需的共享库来解决它。您可以通过执行命令找到这些库ldd。获得它们后,您可以将它们分发到与可执行文件相同的目录中,并设置变量LD_LIBRARY_PATH以便可执行文件可以找到它们。
发生这种情况的原因是,正如文档中所阐明的,当使用该选项时,--stand_alone = true可执行文件将成为具有保存状态的 swipl 副本,并且如果 SWI-Prolog 是静态链接的(默认情况下在 Linux/386 中)并且状态不使用外部包,在另一台机器上运行程序不会有问题。否则(我们的例子)共享对象必须可用,以便可执行文件可以找到它们。在Linux中,这些共享对象是使用ldd(在您的例子中是库libswipl.so.7.2)找到的。因此,您应该查找该库(默认情况下位于 /usr/lib 中)并将其复制到可执行文件的目录中以与其一起分发。然后,在要运行该程序的机器中,必须设置该LD_LIBRARY_PATH变量,以便可执行文件知道在哪里可以找到它需要运行的那些库,即与它所在的目录相同,或者用于chrpath(1)更改可执行文件将搜索的地址。