在dll中嵌入prolog引擎 我一直在研究一个C++应用程序,它嵌入了一个Prolog推理引擎,正如标题中所说的,我现在试图生成一个DLL而不是一个可执行文件,这样我就可以在另一个项目中使用它。由于我是DLL开发新手,我想我可以从一个小例子开始。我有3个文件: likes.pl:定义谓词likes的示例prolog文件/2 likes.cpp:定义调用PlQuery并在std::string中返回结果的函数get_food() food.cpp:使用DLL列出Sam喜欢的各种食物
因此,我的第一次尝试是:在dll中嵌入prolog引擎 我一直在研究一个C++应用程序,它嵌入了一个Prolog推理引擎,正如标题中所说的,我现在试图生成一个DLL而不是一个可执行文件,这样我就可以在另一个项目中使用它。由于我是DLL开发新手,我想我可以从一个小例子开始。我有3个文件: likes.pl:定义谓词likes的示例prolog文件/2 likes.cpp:定义调用PlQuery并在std::string中返回结果的函数get_food() food.cpp:使用DLL列出Sam喜欢的各种食物,c++,dll,prolog,mingw,swi-prolog,C++,Dll,Prolog,Mingw,Swi Prolog,因此,我的第一次尝试是: swipl-ld -shared -dll -o likes -goal true likes.cpp likes.pl -DLIKES_EXPORTS -v g++ -o food.exe -s food.cpp -L. -llikes -I. -L"c:/program files (x86)/swipl/lib" -lswipl -I"c:/program files (x86)/swipl/include" 首先,让我指出,当get_food()只返回一个字符
swipl-ld -shared -dll -o likes -goal true likes.cpp likes.pl -DLIKES_EXPORTS -v
g++ -o food.exe -s food.cpp -L. -llikes -I. -L"c:/program files (x86)/swipl/lib" -lswipl -I"c:/program files (x86)/swipl/include"
首先,让我指出,当get_food()
只返回一个字符串而不调用prolog时,这就可以了。然而,经过两天的调查,我不知道如何让DLL调用prolog。我认为有两件事我可能做错了,也许两者都有:充能初始化和保存状态
我尝试在get_food()
和food.cpp
main()
函数中调用PlEngine,结果相同。所以现在我坚持第一种选择,因为我对在DLL中完成所有事情更感兴趣。我在这里看到()以后可以在DllMain
中完成,但也不建议这样做。最好的方法是什么?我应该将food.exe设置为argv[0]
还是其他形式(libswipl.dll?保存状态?)
其次,我注意到使用swipl ld生成DLL而不是EXE时的一个区别是,它包含以下行:
swipl.exe -f none -F none -g true -t"consult(['likes.pl']),qsave_program('pltmp-4228.exe',[goal=true,toplevel=prolog,init_file=none])"
cat pltmp-4228.exe >> food.exe
因此,我尝试手动操作,将随机名称替换为“mystate.exe”,并使用Win32copy/b
命令将其附加到food.exe。这使得food.exe成为顶级控制台,我可以在其中测试likes/2
。是因为Dll没有任何main()
?无论如何,这是我目前能得到的最远的结果,我想在qsave_程序/2
第二个参数中有一些东西需要更改。我尝试将toplevel=prolog
替换为stand_-alone=true
。顺便说一下,在()末尾给出的命令示例根本不生成任何文件。不管怎么说,我也不知道我是否必须这样做,以及我应该怎样做
有谁能告诉我如何解决这个问题吗?请原谅,因为这并不是对你问题的确切回答,只是一份关于我在这个问题上的经验的报告 我一直在研究一个DLL,它通过C++接口引入Qt绑定。 pqConsole仍在开发中,到目前为止已经找到了它的发展方向,我很高兴与Jan Wielemaker合作,为Prolog观众的扩大迈出了这一小步 我建议您使用G++构建DLL,以获得二进制兼容性,并按原样发布SWI Prolog组件 如果您喜欢Qt,可以使用QtCreator进行界面设计,例如,请参阅。 在这里,您还可以看到我如何在Qt项目资源中嵌入.pl,以更好地控制应用程序(用户不能干扰其他部分所需的Prolog逻辑)和发布(不添加.pl,只添加可执行文件/DLL)
嗯解决了!万一有人某天需要答案:
int main(int argc, char *argv[]) {
char* av[50];
av[0] = (char*)"food.exe";
av[1] = (char*)"-x";
av[2] = (char*)"mystate.exe";
if(!PL_initialise(3, av))
cout << "NO init\n" ;
else
cout << "OK init\n" ;
cout << get_food() ;
getchar();
return 0;
}
>我建议您使用G++构建DLL,以获得二进制兼容性,并按原样发布SWI Prolog组件。对不起,我不明白你在这里的确切意思。在我的DLL中会有一些C++代码吗?那么,我的程序如何能够使用prolog代码中定义的所有谓词呢?我需要的是一种让API调用一些逻辑的方法。我相信有一种方法可以在swi prolog中正确、轻松地完成(一旦您知道要使用什么参数)。。。
swipl --goal=true --stand_alone=true -o mystate -c likes.pl
swipl-ld -shared -dll -o likes -goal true likes.cpp likes.pl -DLIKES_EXPORTS -v
g++ -o food.exe food.cpp -L"c:/program files (x86)/swipl/lib" -lswipl -I"c:/program files (x86)/swipl/include" -L. -llikes -I.