13.2.3 Runtimes and Foreign Code
Many applications use packages that include foreign language
components compiled to shared objects or DLLs. This code is normally
loaded using
use_foreign_library/1
and the foreign
file search path. Below is an example from
the socket
library.
:- use_foreign_library(foreign(socket)).
There are two options to handle shared objects in runtime
applications. The first is to use the foreign(save)
option
of qsave_program/2
or the --foreign=save commandline option. This causes
the dependent shared objects to be included into the resource archive.
The use_foreign_library/1
directive first attempts to find the foreign file in the resource
archive. Alternatively, the shared objects may be placed in a directory
that is distributed with the application. In this cases the file search
path foreign
must be setup to point at this directory. For
example, we can place the shared objects in the same directory as the
executable using the definition below. This may be refined further by
adding subdirectories depending on the architecture as available from
the Prolog flag arch.
:- multifile user:file_search_path/2. user:file_search_path(foreign, Dir) :- current_prolog_flag(executable, Exe), file_directory_name(Exe, Dir).