【问题标题】:Problems integrating SWI-Prolog and C++集成 SWI-Prolog 和 C++ 的问题
【发布时间】:2016-06-30 11:18:01
【问题描述】:

我正在尝试集成 Prolog 和 C++。我将 SWI-Prolog 用于 Prolog,将 Embarcadero Rad Studio 用于 C++。我想在 C++ 中获取输入,在 Prolog 中处理输入并在 C++ 中显示输出。

首先它给出“无法执行链接”错误,但在链接 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

在程序中链接后,报错如下:

[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。链接是Swi-Prolog with QT Creator C++ interface 但我想用 Embarcadero Rad Studio 来做。 所以谁能帮帮我请..

【问题讨论】:

  • 我猜您尝试使用使用不同编译器编译的LIBSWIPL.LIB。这不起作用,编译器使用不同的对象格式。您必须使用 C++Builder 编译所有 SWI-Prolog 源代码。
  • 对不起朋友我不知道如何用 C++Builder 编译所有 SWI-Prolog 的源代码。那你能帮我怎么做吗??
  • 并非如此。我建议阅读 SWI Prolog 的文档(尤其是构建说明),看看它是否提到了 Borland C++ 模式。如果没有,那么您还有一些工作要做。

标签: windows c++builder ffi swi-prolog


【解决方案1】:

感谢大家的建议。 我得到了将 SWI-Prolog 库与 Embarcadero Rad Studio 链接的解决方案。

解决方案:

  1. 我在命令提示符下使用implib.exe将SWI-Prolog库libswipl.dll转换为COFF格式库,因为该库为OMF格式,所需格式为COFF。

  2. 拿到SWI-prolog库的COFF版本后,我将其复制到Embarcadero的Project Folder并包含在Project中。

此包含解决了链接错误并执行了项目。

感谢大家的建议..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多