基于DLL通过C调用SWI-Prolog
我再次需要帮助。我尝试在windows上通过基于dll的C调用SWI Prolog 在我的C程序中,我想使用函数consult_cooco。C代码看起来像基于DLL通过C调用SWI-Prolog,c,dll,ffi,swi-prolog,C,Dll,Ffi,Swi Prolog,我再次需要帮助。我尝试在windows上通过基于dll的C调用SWI Prolog 在我的C程序中,我想使用函数consult_cooco。C代码看起来像 #include "consult_cooco.h" #include <SWI-Prolog.h> int consult_cooco( char** strInput ) { char *program = "consult_cooco"; char *plav[2]; int rval;
#include "consult_cooco.h"
#include <SWI-Prolog.h>
int consult_cooco( char** strInput )
{
char *program = "consult_cooco";
char *plav[2];
int rval;
char* xmlstring;
term_t av;
predicate_t p;
/* make the argument vector for Prolog */
plav[0] = program;
plav[1] = NULL;
putenv("SWI_HOME_DIR=C:\\Program Files (x86)\\swipl");
if ( !PL_initialise(1, plav ) )
PL_halt(1);
av = PL_new_term_refs(2);
p = PL_predicate("start_dialog", 2, "user");
printf("consult_cooco:: input >> %s\n",*strInput);
// Prolog call: start_dialog('ohne Zitrone, mit Joghurt, Butter',XML).
av = PL_new_term_refs(2);
PL_put_atom_chars(av, *strInput);
if ( PL_call_predicate(NULL, PL_Q_NORMAL, p, av) )
{
rval = PL_get_atom_chars(av+1, &xmlstring);
printf(" >> xmlstring of %s is \n\n%s (returned %i)\n",*strInput,xmlstring,rval);
}
else
{
printf(" >> no answer found\n");
}
PL_halt(1);
return 0;
}
start_dialog( InputString, XMLResult ) :-
create_individual_filename('dialog_','.debug',Filename),
tell(Filename),
process_input( InputString, WordList ),
do(WordList, XMLResult ),
told.
我通过
gcc CooCoServer.o -static-libgcc -lws2_32 -L. -lconsult_cooco -I. -o startcoocoserver
Prolog文件dialog.pl的开头如下所示
#include "consult_cooco.h"
#include <SWI-Prolog.h>
int consult_cooco( char** strInput )
{
char *program = "consult_cooco";
char *plav[2];
int rval;
char* xmlstring;
term_t av;
predicate_t p;
/* make the argument vector for Prolog */
plav[0] = program;
plav[1] = NULL;
putenv("SWI_HOME_DIR=C:\\Program Files (x86)\\swipl");
if ( !PL_initialise(1, plav ) )
PL_halt(1);
av = PL_new_term_refs(2);
p = PL_predicate("start_dialog", 2, "user");
printf("consult_cooco:: input >> %s\n",*strInput);
// Prolog call: start_dialog('ohne Zitrone, mit Joghurt, Butter',XML).
av = PL_new_term_refs(2);
PL_put_atom_chars(av, *strInput);
if ( PL_call_predicate(NULL, PL_Q_NORMAL, p, av) )
{
rval = PL_get_atom_chars(av+1, &xmlstring);
printf(" >> xmlstring of %s is \n\n%s (returned %i)\n",*strInput,xmlstring,rval);
}
else
{
printf(" >> no answer found\n");
}
PL_halt(1);
return 0;
}
start_dialog( InputString, XMLResult ) :-
create_individual_filename('dialog_','.debug',Filename),
tell(Filename),
process_input( InputString, WordList ),
do(WordList, XMLResult ),
told.
没有
putenv("SWI_HOME_DIR=C:\\Program Files (x86)\\swipl");
我弄错了
[FATAL ERROR: Could not find system resources]
如SWI Prolog手册所述
但是仍然找不到Prolog谓词,错误描述为
ERROR: '$c_call_prolog'/0: Undefined procedure: start_dialog/2
start_对话框在dialog.pl中定义,请参见上文
我的假设是plav[0]=consult_cooco;错误,找不到指向Prolog文件的链接
当使用从C主文件开始的exe文件时
int consult_cooco( char** strInput )
{
char *program = "consult_cooco";
到
它起作用了。它也适用于
int main( int argc, char** argv )
{
char *program = "call_cooco";
当使用dll时,我会犯什么错误?必须在char*程序中输入什么
非常感谢您的帮助。很抱歉,答案已经给出: 我得去准备
plav[0] = (char*)"startcoocoserver.exe";
plav[1] = (char*)"-x";
plav[2] = (char*)"dialog.exe";
然后使用
if(!PL_initialise(3, plav))
需要额外的构建步骤
swipl --goal=true --stand_alone=true -o dialog -c dialog.pl
在执行其他步骤之前。然后它就起作用了:
PS:我没有找到如何删除一个问题-管理员,请做