运行编译的swi-prolog代码时出错

时间:2015-03-08 04:52:08

标签: prolog runtime-error swi-prolog

如果我采用prolog文件main_write.pl

main :-
    open('test.txt', write, S, [encoding(utf8)]),
    write(S, 'Hello world!'),
    close(S).

然后使用命令编译它:

swipl -q --toplevel=main --stand_alone=true -o c_main_write -c main_wite.pl

我收到c_main_write个文件,当我运行它时,我收到以下错误:

./c_main_write 
ERROR: /usr/lib/swi-prolog/library/filesex.pl:57: Initialization goal raised exception:
ERROR: '$open_shared_object'/3: files: cannot open shared object file: No such file or directory

编译此代码的正确(无错误)方式是什么?

我正在使用以下机器和swipl:

Linux 3.2.0-61-generic #93-Ubuntu SMP i686 i686 i386 GNU/Linux
SWI-Prolog version 6.6.5 for i386

此错误不依赖于文件写入谓词,即使子句的主体非常简单,例如成员(1,[1,2]),也会发生此错误。

2 个答案:

答案 0 :(得分:0)

以下适用于我:

$ cat hello.pl
main :-
    format("Hello!~n"),
    halt.
main :- halt(1).
$ swipl -q --goal=main --stand_alone=true -o hello -c hello.pl
$ ls -l hello*
-rwxr-xr-x 1 boris users 384302 Mar  8 13:16 hello
-rw-r--r-- 1 boris users     53 Mar  8 13:15 hello.pl
$ ./hello
Hello!

您似乎在使用--toplevel=main而不是--goal=main。请参阅manual page on compilation的底部。

答案 1 :(得分:0)

@Boris你的例子对我不起作用。 它不起作用的原因不在于顶层和目标。 --toplevel=main --goal=maincat main_write.pl main :- open('test.txt', write, S, [encoding(utf8)]), write(S, 'Hello world!'), close(S). swipl -q --goal=main --toplevel=halt --stand_alone=true --foreign=save -o c_main_write -c main_write.pl ./c_main_write 的差异,前者不会以交互模式进入。

我找到的解决方案如下:

--foreign_language=save

--goal=main将共享对象(DLL)包含在已保存状态中: http://www.swi-prolog.org/pldoc/doc_for?object=qsave_program/2

我还编辑了--toplevel=halt(初始化目标是main / 0)和{{1}}(在证明目标后,程序停止,因为证明了顶层目标 - 避免进入交互模式。)< / p>