在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”,并使用Win32
copy/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.