我最近在开发一个嵌入了Prolog推理引擎的C++应用程序,现在我想生成一个DLL而不是可执行文件,以便在另一个项目中使用它。由于我对DLL开发还不熟悉,所以我想从一个小例子开始。我有3个文件:
- likes.pl:定义谓词likes/2的示例Prolog文件 - likes.cpp:定义函数get_food(),调用PlQuery并将结果返回到std::string中 - food.cpp:使用DLL列出Sam喜欢的所有食物
所以我第一次尝试的代码如下:
首先,让我指出当
我尝试在
其次,我注意到使用swipl-ld生成DLL而不是EXE的一个区别是它省略了以下行:
所以我试图手动替换随机名称为“mystate.exe”,并使用Win32的
- likes.pl:定义谓词likes/2的示例Prolog文件 - likes.cpp:定义函数get_food(),调用PlQuery并将结果返回到std::string中 - food.cpp:使用DLL列出Sam喜欢的所有食物
所以我第一次尝试的代码如下:
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。我认为我可能做错了两件事情,也许两者都有:PlEngine初始化和保存状态。我尝试在
get_food()
和food.cpp
的main()
函数中调用PlEngine,结果相同。因此,现在我坚持第一种选项,因为我更感兴趣的是将所有事情都在DLL中完成。我在这里看到(Embedding SWI-Prolog in a 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”,并使用Win32的
copy /b
命令将其附加到food.exe中。这使得food.exe成为一个顶级控制台,我可以测试likes/2
。是因为Dll没有任何main()
吗?无论如何,这是我目前能够达到的最远的地方,我想在qsave_program/2
的第二个参数中有一些需要更改的内容。我尝试将toplevel=prolog
替换为stand_alone=true
。顺便说一句,在(http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%272.10%27,swi%28%27/doc/Manual/compilation.html%27%29%29)结尾给出的命令示例根本不会生成任何文件。无论如何,我也搞不清楚我是否以及如何做到这一点。 请问有人能告诉我如何解决这个问题吗?