为什么我无法在Ubuntu 12.04中的Prolog中加载此C代码,但我能够在OS X中

时间:2014-04-02 12:11:06

标签: prolog swi-prolog ffi

我试图了解如何将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

2 个答案:

答案 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的人有用。

相关问题