The utility program plld (Win32: plld.exe) may be used to link a combination of C-files and Prolog files into a stand-alone executable. plld automates most of what is described in the previous sections.
In the normal usage, a copy is made of the default embedding template
\ldots/pl/include/stub.c
. The main() routine is modified to
suit your application. PL_initialise() must
be passed the program-name (argv[0]) (Win32: the executing
program can be obtained using GetModuleFileName()). The other
elements of the command-line may be modified. Next, plld is
typically invoked as:
plld -o output stubfile.c [other-c-or-o-files] [plfiles] |
plld will first split the options into various groups for both the C-compiler and the Prolog compiler. Next, it will add various default options to the C-compiler and call it to create an executable holding the user's C-code and the Prolog kernel. Then, it will call the SWI-Prolog compiler to create a saved state from the provided Prolog files and finally, it will attach this saved state to the created emulator to create the requested executable.
Below, it is described how the options are split and which additional options are passed.
.c
files found on the commandline. Default is
the compiler used to build SWI-Prolog (see feature/2)
(Win32: cl.exe).
.cpp
, .cxx
,
.cc
or .C
) files found on the commandline.
Default is
c++ or g++ if the C-compiler is gcc) (Win32:
cl.exe).
cat <kernel> <state>
> <out>
(Win32: copy /b <kernel>+<state> <out>
)
pl-options
is used as
separator and translated to spaces when the argument is built. Example: -pl-options,-F,xpce
passed -F xpce
as additional flags to Prolog.
-lpl
(Win32: libpl.lib) and the libraries needed by the Prolog kernel are
given.
SWI-Prolog.h
is passed. plld
adds two additional * -Ddef flags:
__SWI_PROLOG__
__SWI_EMBEDDED__
*
The following is a very simple example going through all the steps
outlined above. It provides an arithmetic expression evaluator. We will
call the application calc and define it in the files calc.c
and calc.pl
. The Prolog file is simple:
calc(Atom) :- term_to_atom(Expr, Atom), A is Expr, write(A), nl. |
The C-part of the application parses the command-line options, initialises the Prolog engine, locates the calc/1 predicate and calls it. The coder is in figure 9.
#include <stdio.h> #include <SWI-Prolog.h> #define MAXLINE 1024 int main(int argc, char **argv) { char expression[MAXLINE]; char *e = expression; char *program = argv[0]; char *plav[2]; int n; /* combine all the arguments in a single string */ for(n=1; n<argc; n++) { if ( n != 1 ) *e++ = ' '; strcpy(e, argv[n]); e += strlen(e); } /* make the argument vector for Prolog */ plav[0] = program; plav[1] = NULL; /* initialise Prolog */ if ( !PL_initialise(1, plav) ) PL_halt(1); /* Lookup calc/1 and make the arguments and call */ { predicate_t pred = PL_predicate("calc", 1, "user"); term_t h0 = PL_new_term_refs(1); int rval; PL_put_atom_chars(h0, expression); rval = PL_call_predicate(NULL, PL_Q_NORMAL, pred, h0); PL_halt(rval ? 0 : 1); } return 0; } |
The application is now created using the following command-line:
% plld -o calc calc.c calc.pl |
The following indicates the usage of the application:
% calc pi/2 1.5708 |