我正在尝试整合Prolog和C ++。我正在使用SWI-Prolog for Prolog和Embarcadero Rad Studio for C ++。我想用C ++输入,在Prolog中处理输入并用C ++显示输出。
首先它是'#34;无法执行链接"错误,但在链接SWI-Prolog库后,它给出了错误: -
" [ILINK32错误]错误:' C:\ PROGRAM FILES (X86)\ SWIPL \ LIB \ LIBSWIPL.LIB'包含无效的OMF记录,类型为0x21 (可能是COFF)"。
我搜索并找到使用" implib.exe"解决它。并创建了一个新的库" newlibswipl.lib"。
在程序中链接后,它会产生如下错误: -
[ILINK32错误]错误:未解析的外部' _PL_cut_query'引用 来自C:\ USERS \ DOCUMENTS \ RAD STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解析的外部' _PL_new_term_ref' 从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决 外部' _PL_exception'从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决 外部' _PL_fatal_error'从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决 外部' _PL_chars_to_term'从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决 外部' _PL_put_term'从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决 外部' _PL_predicate'从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决 外部' _PL_open_query'从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决 外部' _PL_next_solution'从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决 外部' _PL_get_arg'从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决 外部' _PL_get_name_arity'从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:未解决 外部' _PL_atom_chars'从C:\ USERS \ DOCUMENTS \ RAD引用 STUDIO \ PROJECTS \ DEBUG \ NEWPROLOG.OBJ [ILINK32错误]错误:无法执行 执行链接
计划: -
//newprolog.cpp
#include <math.h>
#include <iostream>
#include <sstream>
#include "SWI-cpp.h"
#include "SWI-Prolog.h"
#include "SWI-Stream.h"
#pragma comment(lib,"C:\Program Files (x86)\swipl\lib\newlibswipl.lib");
using namespace std;
term_t a;
term_t b;
term_t ans;
functor_t fun;
int main()
{
int digit;
cout << "\nPlease enter a digit to calculate it's Factorial.." << endl;
cin >> digit;
PlCall("consult(swi('C:\Program Files(x86)\swipl\swipl-win.rc'))");
PlCall("consult('factorial.pl')");
a = PL_new_term_ref();
PL_put_integer(a, digit);
b = PL_new_term_ref();
ans = PL_new_term_ref();
fun = PL_new_functor(PL_new_atom("factorial"),2);
PL_cons_functor(ans, fun, a, b);
int fact;
if(PL_call(ans, NULL)) {
PL_get_integer(b, &fact);
//int numb = fact;
}
return 0;
}
Prolog代码是: - //factorial.pl
factorial(1, 1) :- !.
factorial(X, Fac) :- X > 1,
Y is X - 1,
factorial(Y, New_Fac),
Fac is X * New_Fac.
其实我已经从youtube视频中引用了该视频,其中该人使用了QT创建者而不是Rad Studio ..链接为Swi-Prolog with QT Creator C++ interface 但是我想用Embarcadero Rad Studio来做这件事。 所以任何人都可以帮助我..
答案 0 :(得分:1)
谢谢大家的建议。 我得到了将SWI-Prolog库与Embarcadero Rad Studio链接的解决方案。
解决方案: -
1)。我在命令提示符下使用 implib.exe 将SWI-Prolog库“libswipl.dll”转换为“coff”格式库,因为库是“omf”格式和所需格式是“coff”。
2)。在获得SWI-prolog库的“coff”格式后,我将其复制到Embarcadero的项目文件夹中并将其包含在项目中。
此包含解决了链接错误并执行了项目。
感谢大家的建议..