如果我采用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]),也会发生此错误。
答案 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=main
与cat 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>