为什么我不能在Ubuntu 12.04的Prolog中加载这段C代码,但我可以在OS X中加载

为什么我不能在Ubuntu 12.04的Prolog中加载这段C代码,但我可以在OS X中加载,prolog,swi-prolog,ffi,Prolog,Swi Prolog,Ffi,我试图理解如何将C代码与SWI Prolog链接,但我遇到了一些困难。当我编译并加载下面的代码时,它在OSX上运行得非常好,但是当我将完全相同的代码移到Ubuntu12.04上时,它就不工作了。我得到了错误 ERROR: Exported procedure choose:choose/3 is not defined 当然还有。我不能再呼叫选择。当我尝试在一台全新的虚拟机上安装它时,它确实适用于SWI Prolog 5.10.4,但当我升级到新版本时,它再次失败。如果我使用5.10.4编译时

我试图理解如何将C代码与SWI Prolog链接,但我遇到了一些困难。当我编译并加载下面的代码时,它在OSX上运行得非常好,但是当我将完全相同的代码移到Ubuntu12.04上时,它就不工作了。我得到了错误

ERROR: Exported procedure choose:choose/3 is not defined
当然还有。我不能再呼叫
选择
。当我尝试在一台全新的虚拟机上安装它时,它确实适用于SWI Prolog 5.10.4,但当我升级到新版本时,它再次失败。如果我使用5.10.4编译时的旧.so文件,它仍然有效。但是,我无法使用swipl-ld编译并链接新的.so文件与新版本的SWI-Prolog

我做错了什么


二项式

:- module(binomial, [choose/3]).
:- use_foreign_library(choose).
选择

#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);
}

闻起来很像这个


建议更新您的问题,添加linux版本。。可能对swi的人有用。

闻起来很像这样


建议更新您的问题,添加linux版本。。可能对swi的人有用。

闻起来很像这样


建议更新您的问题,添加linux版本。。可能对swi的人有用。

闻起来很像这样


建议更新您的问题,添加linux版本。。可能对swi的同事有用。

问题是由于共享libswipl.so安装在/usr/lib中,并且 /usr/lib/swi prolog/lib/arch中的静态libswipl.a,这会导致链接器选择 静态版本。临时解决方法是从/usr/lib/swi-prolog/lib/中删除libswipl.a

未来的版本将在/usr/lib中安装libswipl.a,因此您也可以移动库,尽管这样做
如果升级到下一版本,可能会导致apt报告的冲突。

问题是由于共享libswipl.so安装在/usr/lib中,并且 /usr/lib/swi prolog/lib/arch中的静态libswipl.a,这会导致链接器选择 静态版本。临时解决方法是从/usr/lib/swi-prolog/lib/中删除libswipl.a

未来的版本将在/usr/lib中安装libswipl.a,因此您也可以移动库,尽管这样做
如果升级到下一版本,可能会导致apt报告的冲突。

问题是由于共享libswipl.so安装在/usr/lib中,并且 /usr/lib/swi prolog/lib/arch中的静态libswipl.a,这会导致链接器选择 静态版本。临时解决方法是从/usr/lib/swi-prolog/lib/中删除libswipl.a

未来的版本将在/usr/lib中安装libswipl.a,因此您也可以移动库,尽管这样做
如果升级到下一版本,可能会导致apt报告的冲突。

问题是由于共享libswipl.so安装在/usr/lib中,并且 /usr/lib/swi prolog/lib/arch中的静态libswipl.a,这会导致链接器选择 静态版本。临时解决方法是从/usr/lib/swi-prolog/lib/中删除libswipl.a

未来的版本将在/usr/lib中安装libswipl.a,因此您也可以移动库,尽管这样做 如果升级到下一版本,可能会导致apt报告的冲突

swipl-ld -lgmp -shared -o choose choose.c