2016-03-15 41 views
1

我正在嘗試整合Prolog和C++。我正在爲Prolog和Embarcadero Rad Studio for C++使用SWI-Prolog。我想用C++進行輸入,在Prolog中處理輸入,並在C++中顯示輸出。整合SWI-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

計劃: -

//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創建者的視頻中引用它拉德Studio..The鏈接TEAD是Swi-Prolog with QT Creator C++ interface 但我想用Embarcadero公司的RAD Studio .. 所以任何人都可以幫我請..

+0

我猜你嘗試使用'LIBSWIPL.LIB'編譯與不同的編譯器。這是行不通的,編譯器使用不同的對象格式。您必須使用C++ Builder編譯SWI-Prolog的所有源代碼。 –

+0

不好意思的朋友我不知道如何用C++ Builder編譯SWI-Prolog的所有源代碼。那麼你能幫我怎麼做嗎? –

+0

不是。我建議通過SWI Prolog的文檔(尤其是構建說明)閱讀它,看看它是否提到了Borland C++模式。如果沒有,那麼你有一些工作在你面前。 –

回答

1

謝謝大家的建議去做。 我得到了解決方案,將SWI-Prolog的庫與Embarcadero Rad Studio鏈接起來。

解決方案: -

1)。我在命令提示符中使用了implib.exe將庫文件爲「omf」格式並且所需格式爲「coff」時,將SWI-Prolog庫「libswipl.dll」轉換爲「coff」格式庫。 2)。在獲得SWI-prolog庫的「coff」格式後,我將它複製到Embarcadero的項目文件夾並將其包含在項目中。

該包含解決了鏈接錯誤並執行了項目。

謝謝大家的建議..