> Hej, jag skulle vilja veta hur man skapar en fristående exekverbar > fil utifrån en pl-fil. > Jag har sökt igenom er dokumentation och internet och inte kommit > längre än till en exe-fil som inte fungerar på någon annan dator än > den jag skapade filen på. Om du byggt med spld --static så har du en .exe-fil som inte behöver något med SICStus-relaterat på målmaskinen (som är maskinen där SICStus inte är installerat). På målmaskinen måste dock Microsofts C-bibliotek finnas installerat. Det finns tre olika versioner av SICStus för Windows, beroende på vilken av Microsofts C-kompilatorer som använts för att bygga SICStus. Motsvarande C-bibliotek måste installeras på målmaskinen. Om du t.ex. har använt SICStus Prolog VC10 4.2.0 så behöver du installera vcredist_x86.exe från . De senaste versionerna av de olika C-bibloteken finns att ladda hem från sidan (där de kallas "VC++ Redistributable Packages"). Antagligen är det avsaknaden av C-biblioteket som gör att ditt program inte fungera på någon annan dator än den du skapade filen på. Som du märkt så är vår dokumentation otillräcklig (den tekniska termen är "usel") när det gäller hur man bygger och distribuerar SICStus-program på Windows. En anledning är att "riktiga" program behöver annan C-kod och en installerare och då behöver man veta hur man på Windows skapar ett C-program och skapar installerare som installerar ett program skrivet i C. Om man vet det så är det inte svårt att installera ett program skapat med SICStus. Om man däremot, som du, bara vill snabbt och enkelt skapa en exe-fil från Prolog-kod och inte redan vet allt om installation av C-program på Windows, så är det betydligt besvärligare och vi borde verkligen förbättra dokumentationen. Nedan följer två olika sätt att skapa en exe-fil som bygger på en prologfil (test.pl) som använder library(sets). Kommentarer startar med #. ### START Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. Med ensamrätt. # Programmet c:\SICStus>type test.pl type test.pl %% test.pl BEGIN :- module(test, []). :- use_module(library(sets), [intersection/3]). main :- %% argv is the commands passed on the command line (or after the %% option '--' if run in a development system). current_prolog_flag(argv, Argv), sort(Argv, Set1), Set2 = [a, c, g], intersection(Set1, Set2, Intersection), format('The intersection of ~w and ~w is ~w~n', [Set1, Set2, Intersection]). % .sav-file entry point user:runtime_entry(start) :- main. %% test.pl END # Metod 1 # Skapa .sav-filen genom att kompilera från SICStus toppnivå. Det kan # göras från kommandoraden, som här, eller från Emacs, SPIDER eller # från ett byggskript # Från kommandoraden använder jag flaggan -i, som ger interaktivt beteende. c:\SICStus>"C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\sicstus.exe" -i "C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\sicstus.exe" -i SICStus 4.2.1 (x86-win32-nt-4): Wed Feb 1 01:21:34 WEST 2012 Licensed to SICS | ?- compile(test), save_program('test.sav'). % compiling c:/sicstus/test.pl... % module test imported into user % loading ..../sets.po... % module sets imported into test % loading ..../lists.po... % module lists imported into sets % loading ..../types.po... % module types imported into lists % loaded ..../types.po in module types, 0 msec 864 bytes % loaded ..../lists.po in module lists, 15 msec 55488 bytes % loaded ..../sets.po in module sets, 15 msec 65992 bytes % compiled c:/sicstus/test.pl in module test, 15 msec 69576 bytes % c:/sicstus/test.sav created in 32 msec yes | ?- halt. # Ladda inställningar som gör C-kompilator och annat # tillgängligt. Detta kräver att du har Microsofts C-kompilator # installerad. Det skall vara en version av C-kompilatorn som # passer den SICStus du använder. Antagligen fungera det bra med # gratisversionen "Express" men det är inget vi undersökt. # c:\SICStus>"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 Setting environment for using Microsoft Visual Studio 2010 x86 tools. # Bygg ditt program med kommandot spld. Flaggan --static gör att allt # hamnar i exe-filen så inga andra SICStus-relaterade filer behövs # (men C-biblioteket behöver fortfarande installeras, enligt ovan) c:\SICStus>"C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\spld.exe" --static test.sav -o test1.exe "C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\spld.exe" --static test.sav -o test1.exe Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385 Copyright (C) Microsoft Corporation. All rights reserved. spldgen_s_10160_1332866986_restore_main.c spldgen_s_10160_1332866986_main_wrapper.c spldgen_s_10160_1332866986_prolog_rtable.c Creating library test1.lib and object test1.exp Created "test1.exe" # Prova programmet: c:\SICStus>.\test1.exe a b c d e f .\test1.exe a b c d e f The intersection of [a,b,c,d,e,f] and [a,c,g] is [a,c] # Metod 2 # Skapa sav-filen igen. Det är viktigt att den heter main.sav # c:\SICStus>"C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\sicstus.exe" -i "C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\sicstus.exe" -i SICStus 4.2.1 (x86-win32-nt-4): Wed Feb 1 01:21:34 WEST 2012 Licensed to SICS | ?- compile(test), save_program('main.sav'). % compiling c:/sicstus/test.pl... % module test imported into user % loading ..../sets.po... % module sets imported into test % loading ..../lists.po... % module lists imported into sets % loading ..../types.po... % module types imported into lists % loaded ..../types.po in module types, 0 msec 864 bytes % loaded ..../lists.po in module lists, 0 msec 55488 bytes % loaded ..../sets.po in module sets, 0 msec 65992 bytes % compiled c:/sicstus/test.pl in module test, 0 msec 69576 bytes % c:/sicstus/main.sav created in 15 msec yes | ?- halt. # Skapa en ny mapp för detta exempel c:\SICStus>mkdir test2 mkdir test2 # Flytta dig till den nya mappen c:\SICStus>cd test2 cd test2 # Kopiera main.sav till den nya mappen c:\SICStus\test2>copy ..\main.sav . copy ..\main.sav . 1 fil(er) kopierad(e). # kopiera sprt.exe, sprt4-2-1.dll samt sprt.sav från # SICStus-installationen till din nya mapp c:\SICStus\test2>copy "C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\sprt.exe" .\test2.exe copy "C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\sprt.exe" .\test2.exe 1 fil(er) kopierad(e). c:\SICStus\test2>copy "C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\sprt4-2-1.dll" . copy "C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\sprt4-2-1.dll" . 1 fil(er) kopierad(e). c:\SICStus\test2>copy "C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\sprt.sav" . copy "C:\Program Files (x86)\SICStus Prolog VC10 4.2.1\bin\sprt.sav" . 1 fil(er) kopierad(e). # Nu innehåller mappen test2 allt som behövs (förutom C-biblioteket # som måste installeras, enligt ovan): c:\SICStus\test2>dir dir Volymen i enhet C har etiketten OS Volymens serienummer är F2A8-36BB Innehåll i katalogen c:\SICStus\test2 2012-03-27 20:01 . 2012-03-27 20:01 .. 2012-03-27 18:50 53 254 main.sav 2012-02-01 02:41 218 940 sprt.sav 2012-02-01 02:40 788 480 sprt4-2-1.dll 2012-02-01 02:41 19 968 test2.exe 4 fil(er) 1 080 642 byte 2 katalog(er) 1 277 587 456 byte ledigt # Programmet fungerar. Mappen test2 kan kopieras till en annan maskin # och där ska det också fungera om C-biblioteket är installerat. c:\SICStus\test2>.\test2.exe a b c d e f g h .\test2.exe a b c d e f g h The intersection of [a,b,c,d,e,f,g,h] and [a,c,g] is [a,c,g] ### SLUT Kontakt mig om du har mer frågor M.v.h. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- > Nu har jag testat de båda lösningarna och båda verkar fungera. Nu > tänkte jag posta lösningen på stackoverflow som svar på frågan jag > ställde tidigare i veckan om just detta ämne. Tänkte bara höra efter > om det var okej med er? Visst. Det går bra. > Dessutom skulle undrar jag vilka C-kompilatorer som hör till vilka > versioner av sicstus? Finns det något sätt att ta reda på vilken > C-kompilator som användes vid byggandet av sicstus? Det framgår av nedladdningssidan. Det hjälper dock inte dig om du fått installeraren på annat sätt, t.ex. från skolan. En ledtråd är installerarens namn ("InstallSICStus.exe", "InstallSICStus-vc9.exe", respektive "InstallSICStus-vc10.exe") samt installationsmappen ("SICStus Prolog 4.2.1", "SICStus Prolog VC9 4.2.1", respektive "SICStus Prolog VC10 4.2.1"). I dessa namn står VC9 för Visual Studio 2008 Service Pack 1 (SP1) och VC10 står för Visual Studio 2010 SP1. Om det inte står något VC... i namnet så motsvarar det Visual Studio 2005 SP1.