集成 SWI-Prolog 和 C++ 的问题
Problems integrating SWI-Prolog and C++
我正在尝试集成 Prolog 和 C++。我正在为 Prolog 使用 SWI-Prolog,为 C++ 使用 Embarcadero Rad Studio。我想在 C++ 中获取输入,在 Prolog 中处理输入并在 C++ 中显示输出。
首先它给出了“无法执行 link”错误,但是在 linking SWI-Prolog 库之后它给出了错误:
[ILINK32 Error] Error: 'C:\PROGRAM FILES
(X86)\SWIPL\LIB\LIBSWIPL.LIB' contains invalid OMF record, type 0x21
(possibly COFF)
我搜索并找到使用 implib.exe
解决它并创建了一个新库 newlibswipl.lib
。
在程序中 linking 后出现如下错误:
[ILINK32 Error] Error: Unresolved external '_PL_cut_query' referenced
from C:\USERS\DOCUMENTS\RAD STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ
[ILINK32 Error] Error: Unresolved external '_PL_new_term_ref'
referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_exception' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_fatal_error' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_chars_to_term' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_put_term' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_predicate' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_open_query' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_next_solution' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_get_arg' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_get_name_arity' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_atom_chars' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unable to
perform link
C++代码:
// 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;
}
和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 creator 而不是 Rad Studio。 link 是 Swi-Prolog with QT Creator C++ interface
但我想使用 Embarcadero Rad Studio 来完成。
所以有人可以帮我吗..
谢谢大家的建议。
我用 Embarcadero Rad Studio 得到了 link SWI-Prolog 库的解决方案。
解决方案:
我在命令提示符下使用implib.exe
将SWI-Prolog库libswipl.dll
转换为COFF格式库,因为该库是OMF格式并且需要格式为 COFF。
得到SWI-prolog库的COFF版本后,复制到Embarcadero的Project文件夹中,并包含在Project中
此包含解决了 linking 错误并执行了项目。
感谢大家的建议..
我正在尝试集成 Prolog 和 C++。我正在为 Prolog 使用 SWI-Prolog,为 C++ 使用 Embarcadero Rad Studio。我想在 C++ 中获取输入,在 Prolog 中处理输入并在 C++ 中显示输出。
首先它给出了“无法执行 link”错误,但是在 linking SWI-Prolog 库之后它给出了错误:
[ILINK32 Error] Error: 'C:\PROGRAM FILES
(X86)\SWIPL\LIB\LIBSWIPL.LIB' contains invalid OMF record, type 0x21
(possibly COFF)
我搜索并找到使用 implib.exe
解决它并创建了一个新库 newlibswipl.lib
。
在程序中 linking 后出现如下错误:
[ILINK32 Error] Error: Unresolved external '_PL_cut_query' referenced
from C:\USERS\DOCUMENTS\RAD STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ
[ILINK32 Error] Error: Unresolved external '_PL_new_term_ref'
referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_exception' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_fatal_error' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_chars_to_term' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_put_term' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_predicate' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_open_query' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_next_solution' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_get_arg' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_get_name_arity' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unresolved
external '_PL_atom_chars' referenced from C:\USERS\DOCUMENTS\RAD
STUDIO\PROJECTS\DEBUG\NEWPROLOG.OBJ [ILINK32 Error] Error: Unable to
perform link
C++代码:
// 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;
}
和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 creator 而不是 Rad Studio。 link 是 Swi-Prolog with QT Creator C++ interface 但我想使用 Embarcadero Rad Studio 来完成。 所以有人可以帮我吗..
谢谢大家的建议。 我用 Embarcadero Rad Studio 得到了 link SWI-Prolog 库的解决方案。
解决方案:
我在命令提示符下使用
implib.exe
将SWI-Prolog库libswipl.dll
转换为COFF格式库,因为该库是OMF格式并且需要格式为 COFF。得到SWI-prolog库的COFF版本后,复制到Embarcadero的Project文件夹中,并包含在Project中
此包含解决了 linking 错误并执行了项目。
感谢大家的建议..