I have something that runs under GNU/Linux and does not run under Cygwin. It all boils down to something very simple. I have two files: $ cat main.cc #include <SWI-Prolog.h> int main(int, char** argv) { char* pl_args[2]; pl_args[0] = argv[0]; pl_args[1] = 0; if (!PL_initialise(1, pl_args)) PL_halt(1); predicate_t pred = PL_predicate("mymain", 0, "user"); term_t h0 = PL_new_term_refs(0); int ret_val = PL_call_predicate(0, PL_Q_NORMAL, pred, h0); PL_halt(ret_val ? 0 : 1); } $ cat mymain.pl mymain :- write('mymain/0 called!'), nl. I compile them under GNU/Linux: $ g++ -I/usr/local/lib/pl-5.6.2/include -c main.cc $ plld -v -cc gcc -c++ g++ -ld g++ -o test.exe main.o mymain.pl eval `pl -dump-runtime-variables` CC="gcc" PLBASE="/usr/local/lib/pl-5.6.2" PLARCH="i686-linux" PLLIBS="-lgmp -ldl -lreadline -lncursesw -lm -lrt" PLLIB="-lpl" PLLDFLAGS="-export-dynamic -O3 -pthread" PLSOEXT="so" PLTHREADS="yes" g++ -o test.exe -export-dynamic -O3 -pthread main.o -L/usr/local/lib/pl-5.6.2/lib/i686-linux -lpl -lgmp -ldl -lreadline -lncursesw -lm -lrt pl -f none -F none -g true -t "consult(['mymain.pl']),qsave_program('pltmp-8678',[goal='\$welcome',toplevel=prolog,init_file=none])" % mymain.pl compiled 0.00 sec, 2,004 bytes % halt cat pltmp-8678 >> test.exe chmod 775 test.exe rm pltmp-8678 I compile them in exactly the same way under Cygwin (note: same version of SWI-Prolog, configured in the same way and installed in the same place): $ g++ -I/usr/local/lib/pl-5.6.2/include -c main.cc $ plld -v -cc gcc -c++ g++ -ld g++ -o test.exe main.o mymain.pl eval `pl -dump-runtime-variables` % mymain.pl compiled 0.00 sec, 1,984 bytes % halt CC="gcc" PLBASE="/usr/local/lib/pl-5.6.2" PLARCH="i686-cygwin" PLLIBS="-lgmp -lreadline -lncurses -lm -lpthread" PLLIB="-lpl" PLLDFLAGS="-export-dynamic -O3" PLSOEXT="dll" PLTHREADS="yes" g++ -o test.exe -export-dynamic -O3 main.o -L/usr/local/lib/pl-5.6.2/lib/i686-cygwin -lpl -lgmp -lreadline -lncurses -lm -lpthread pl -f none -F none -g true -t "consult(['mymain.pl']),qsave_program('pltmp-3416.exe',[goal='\$welcome',toplevel=prolog,init_file=none])" cat pltmp-3416.exe >> test.exe chmod 755 test.exe rm pltmp-3416.exe However, when I run the result under GNU/Linux I get: $ ./test.exe Welcome to SWI-Prolog (Multi-threaded, Version 5.6.2) Copyright (c) 1990-2005 University of Amsterdam. SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Please visit http://www.swi-prolog.org for details. For help, use ?- help(Topic). or ?- apropos(Word). mymain/0 called! $ When I run under Cygwin I get: $ ./test.exe Welcome to SWI-Prolog (Multi-threaded, Version 5.6.2) Copyright (c) 1990-2005 University of Amsterdam. SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Please visit http://www.swi-prolog.org for details. For help, use ?- help(Topic). or ?- apropos(Word). ERROR: Undefined procedure: mymain/0 What am I missing? All the best, Roberto -- Prof. Roberto Bagnara Computer Science Group Department of Mathematics, University of Parma, Italy http://www.cs.unipr.it/~bagnara/ mailto:bagnara@cs.unipr.it