我试图了解如何将C代码与SWI-Prolog联系起来,但我遇到了一些困难。当我编译以下代码并加载它时,它在OS X上运行完美,但是当我将完全相同的代码移动到Ubuntu 12.04时,它不起作用。我收到了错误
ERROR: Exported procedure choose:choose/3 is not defined
当然。我再也打电话给choose
了。当我尝试在全新的虚拟机上安装它时,它确实适用于SWI-Prolog 5.10.4,但当我升级到latest stable version时,它又开始失败了。如果我使用旧的.so文件,当我使用5.10.4编译它时它仍然有效。但是我无法使用swipl-ld编译和链接新的.so文件和新版本的SWI-Prolog。
我做错了什么?
binomial.pl
:- module(binomial, [choose/3]).
:- use_foreign_library(choose).
choose.c
#include <gmp.h>
#include <SWI-Prolog.h>
static foreign_t
pl_choose(term_t size, term_t take, term_t result)
{
mpz_t rop;
mpz_t n;
unsigned long int k;
int rc;
mpz_init(rop);
mpz_init(n);
if ( PL_get_mpz(take, rop) && PL_get_mpz(size, n) )
{
k = mpz_get_ui(rop);
mpz_bin_ui(rop, n, k);
rc = PL_unify_mpz(result, rop);
}
else
{
rc = FALSE;
}
mpz_clear(rop);
mpz_clear(n);
return rc;
}
install_t
install_choose()
{
PL_register_foreign("choose", 3, pl_choose, 0);
}
我通过调用
构建并链接它swipl-ld -lgmp -shared -o choose choose.c
答案 0 :(得分:2)
问题是由于共享的libswipl.so安装在/ usr / lib和 / usr / lib / swi-prolog / lib / arch 中的静态libswipl.a,它会导致链接器选择 静态版本。临时解决方法是从/ usr / lib / swi-prolog / lib /中删除libswipl.a。
未来版本将在/ usr / lib中安装libswipl.a,因此您也可以移动库 如果升级到下一个版本,可能会导致apt报告冲突。
答案 1 :(得分:1)
闻起来很像这样......
http://swi-prolog.996271.n3.nabble.com/Undefined-procedure-on-foreign-library-in-6-6-4-td14676.html
建议更新你的问题,添加linux版本..可能对swi的人有用。