I’m using: SWI-Prolog version linux gentoo 9.39.9-r1
I want the code to:
While running as standalone elf executable, lookup and load a C library which is installed in a “~/lib/prolog” directory in my home.
But what I’m getting is:
The executable cannot load the C library: Existence_error(source_sink,“lib.so”)
.
Whereas, it works nice when executed from the interactive swipl.
I tried various file_search_path/2
solutions, to no avail.
My code looks like this:
% lib/lib.pl
:- module(lib, [cpred/0]).
:- use_foreign_library("lib.so").
/* lib/lib.c */
#include <stdio.h>
#include <SWI-Prolog.h>
install_t install(void);
foreign_t cpred(void) {
puts("works");
PL_succeed;
}
install_t install(void) {
PL_register_foreign("cpred", 0, cpred, 0);
}
% exe/exe.pl
:- use_module(library(lib)).
:- initialization(main, main).
main :-
cpred.
% ~/.config/swi-prolog/init.pl
file_search_path(library, '/home/mala/lib/prolog').
file_search_path(foreign, '/home/mala/lib/prolog').
Compilation and installation of lib
:
$ cd lib
$ swipl-ld -shared -o lib.so lib.c
$ cp lib.so lib.pl ~/lib/prolog/
Compilation of exe
:
$ cd exe
$ swipl -o exe -p library=~/lib/prolog --stand-alone -c exe.pl
Run (does not work):
$ ./exe
ERROR: /home/mala/lib/prolog/lib.pl:5: Initialization goal raised exception:
ERROR: source_sink `"lib.so"' does not exist
ERROR: In:
ERROR: [19] throw(error(existence_error(source_sink,"lib.so"),_256))
ERROR: [17] shlib:load_foreign_library("lib.so",lib,[]) at /usr/lib/swipl/library/shlib.pl:398
Run of the exe.pl
source from the swipl
toplevel (works):
$ swipl
?- [exe].
true.
?- main.
works
true.